/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package war;

import ejb.*;

import java.io.*;
import java.math.BigInteger;
import java.nio.charset.Charset;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import javax.ejb.EJB;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;

/**
 *
 * @author allam
 */
@WebServlet(name = "Controller", urlPatterns = {"/Controller"})
public class Controller extends HttpServlet {

    @EJB
    private GestoreRecensioniBeanLocal gestoreRecensioniBean;
    //Variabili che fanno riferimento agli Enterprise Java Beans
    @EJB
    private GestoreUtenteBeanLocal gestoreUtenteBean;
    @EJB
    private GestoreVideogameBeanLocal gestoreVideogameBean;
    @EJB
    private GestoreNotiziaBeanLocal gestoreNotiziaBean;
    @EJB
    private GestoreMessaggioBeanLocal gestoreMessaggioBean;
    @EJB
    private PiattaformaFacadeLocal piattaformaFacade;
    @EJB
    private GestoreArticoloBeanLocal gestoreArticoloBean;
    @EJB
    private NotiziaFacadeLocal notiziaFacade;
    PrintWriter out;
    ServletContext sc;
    RequestDispatcher rd;
    HttpSession session;
    String azione;
    private String appPath;

    /**
     * Processes requests for both HTTP
     * <code>GET</code> and
     * <code>POST</code> methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        out = response.getWriter();
        sc = getServletContext();
        rd = null;
        session = request.getSession();
        String cerca = request.getParameter("cerca");
        azione = request.getParameter("button");
        try {
            if (cerca != null) {
                azioneCerca(request, response);
            }
            if (azione != null) {
                if (azione.equals("aggiungiAdministrators")) {

                    azioneAggiungiAdministrators(request, response);
                } else if (azione.equals("home")) {
                    azioneHome(request,response);
                    
                } else if (azione.equals("registrati")) {
                    azioneRegistrazione(request, response);
                } else if (azione.equals("registraUtente")) {
                    azioneRegistrazioneUtente(request, response);
                } else if (azione.equals("aggiungiRecensoreAus")) {
                    azioneAggiungiRecensoreAus(request, response);
                } else if (azione.equals("AggiungiRecensore")) {
                    azioneAggiungiRecensore(request, response);
                } else if (azione.equals("cancellaRecensore")) {
                    azioneCancellaRecensore(request, response);
                } else if (azione.equals("visualizzaRecensori")) {
                    azioneVisualizzaRecensori(request, response);
                } else if (azione.equals("visualizzaUtenti")) {
                    azioneVisualizzaUtenti(request, response);
                } else if (azione.equals("cancellaUtente")) {
                    azioneCancellaUtente(request, response);
                } else if (azione.equals("login")) {
                    azioneLogin(request, response);
                } else if (azione.equals("logout")) {
                    azioneLogout(request, response);
                } else if (azione.equals("modificaProfiloAus")) {
                    azioneModificaUtenteAus(request, response);
                } else if (azione.equals("modificaProfilo")) {
                    azioneModificaUtente(request, response);
                } else if (azione.equals("rimuoviUtenteAus")) {
                    azioneRimuoviUtenteAus(request, response);
                } else if (azione.equals("rimuoviUtente")) {
                    azioneRimuoviUtente(request, response);
                } else if (azione.equals("mostraElencoUtenti")) {
                    azioneMostraElencoUtenti(request, response);
                    //azioneMostraElencoUtentiCompleto(request, response);
                } else if (azione.equals("aggiungiNotiziaAus")) {
                    azioneAggiungiNotiziaAus(request, response);
                } else if (azione.equals("aggiungiNotizia")) {
                    azioneAggiungiNotizia(request, response);
                } else if (azione.equals("modificaNotiziaAus")) {
                    azioneModificaNotiziaAus(request, response);
                } else if (azione.equals("preparaModificaNotizia")) {
                    azionePreparaModificaNotizia(request, response);
                } else if (azione.equals("modificaNotizia")) {
                    azioneModificaNotizia(request, response);
                } else if (azione.equals("mostraElencoNotizie")) {
                    azioneMostraElencoNotizie(request, response);
                } else if (azione.equals("cancellaNotiziaAus")) {
                    azioneCancellaNotiziaAus(request, response);
                } else if (azione.equals("cancellaNotizia")) {
                    azioneCancellaNotizia(request, response);
                } else if (azione.equals("aggiungiPiattaformaAus")) {
                    azioneAggiungiPiattaformaAus(request, response);
                } else if (azione.equals("aggiungiPiattaforma")) {
                    azioneAggiungiPiattaforma(request, response);
                } else if (azione.equals("visualizzaPiattaforme")) {
                    azioneVisualizzaPiattaforme(request, response);
                } else if (azione.equals("cancellaPiattaforma")) {
                    azioneCancellaPiattaforme(request, response);
                } /*aggiunto da Giuseppe*/ else if (azione.equals("aggiungiVideogioco")) {
                    azioneAggiungiVideogioco(request, response);
                } else if (azione.equals("visualizzaRecNot")) {
                    azioneVisualizzaRecNot(request, response);
                } else if (azione.equals("inserisciArtUsatoUtente")) {
                    azioneInserisciArticoloUsatoUtente(request, response);
                } else if (azione.equals("vendiArticolo")) {
                    azioneVendiArticolo(request, response);
                } else if (azione.equals("aggiungiRecensioneInternaAus") || azione.equals("aggiungiImmagineRecensione") || azione.equals("rimuoviImmagineRecensione") || azione.equals("aggiungiPro") || azione.equals("rimuoviPro") || azione.equals("aggiungiContro") || azione.equals("rimuoviContro")) {
                    azioneAggiungiRecensioneInternaAus(request, response);
                } else if (azione.equals("aggiungiRecensioneInterna")) {
                    azioneAggiungiRecensioneInterna(request, response);
                } else if (azione.equals("aggiungiVideogiocoAus") || azione.equals("aggiungiImmagineVideogioco") || azione.equals("rimuoviImmagineVideogioco")) {
                    azioneAggiungiVideogiocoAus(request, response);
                } else if (azione.equals("modificaVideogiocoAus")) {
                    azioneModificaVideogiocoAus(request, response);
                } else if (azione.equals("visualizzaModificaCancellaVideogioco")) {
                    azioneVisualizzaModificaCancellaVideogioco(request, response);
                } else if (azione.equals("modificaVideogioco")) {
                    azioneModificaVideogioco(request, response);
                } else if (azione.equals("rimuoviVideogioco")) {
                    azioneRimuoviVideogioco(request, response);
                } else if (azione.equals("visualizzaVideogioco")) {
                    azioneVisualizzaVideogioco(request, response);
                } /*author Roberto else*/ else if (azione.equals("articoloNuovo")) {
                    azioneArticoloNuovo(request, response);
                } else if (azione.equals("articoloUsato")) {
                    azioneArticoloUsato(request, response);
                } else if (azione.equals("inserisciArtNuovo")) {
                    azioneAggiungiArticoloNuovo(request, response);
                } else if (azione.equals("modificaArtNuovo")) {
                    azionePreparaEditArticoloNuovo(request, response);
                } else if (azione.equals("cancellaArtNuovo")) {
                    azioneCancellaArticoloNuovo(request, response);
                } else if (azione.equals("editArtNuovo")) {
                    azioneEditArticoloNuovo(request, response);
                } else if (azione.equals("modificaCancellaArtNuovi")) {
                    azioneModificaCancellaArtNuovi(request, response);
                } else if (azione.equals("inserisciArtUsato")) {
                    azioneInserisciArticoloUsato(request, response);
                } else if (azione.equals("modificaArtUsato")) {
                    azionePreparaEditArticoloUsato(request, response);
                } else if (azione.equals("confermaArtUsato")) {
                    azioneConfermaArticoloUsato(request, response);
                } else if (azione.equals("cancellaArtUsato")) {
                    azioneCancellaArticoloUsato(request, response);
                } else if (azione.equals("editArtUsato")) {
                    azioneEditaArticoloUsato(request, response);
                } else if (azione.equals("ricercaArticolo")) {
                    azioneRicercaArticolo(request, response);
                } else if (azione.equals("cercaArticolo")) {
                    azioneRicercaArticolo(request, response);
                } else if (azione.equals("visualizzaArticoli")) {
                    azioneVisualizzaArticoli(request, response);
                } //aggiunto da giuseppe
                else if (azione.equals("modificaCancellaArtUsati")) {
                    azioneModificaCancellaArtUsati(request, response);
                } else if (azione.equals("addCarrello")) {
                    azioneAddCarrello(request, response);
                } else if (azione.equals("removeCarrello")) {
                    azioneRemoveCarrello(request, response);
                } else if (azione.equals("visualizzaMailboxRicevuti")) {
                    azioneVisualizzaMailboxRicevuti(request, response);
                } else if (azione.equals("visualizzaMailboxInviati")) {
                    azioneVisualizzaMailboxInviati(request, response);
                } else if (azione.equals("scriviMessaggio")) {
                    azioneScriviMessaggio(request, response);
                } else if (azione.equals("inviaMessaggio")) {
                    azioneInviaMessaggio(request, response);
                } else if (azione.equals("visualizzaMessaggio")) {
                    azioneVisualizzaMessaggio(request, response);
                } else if (azione.equals("rispondiMessaggio")) {
                    azioneRispondiMessaggio(request, response);
                } else if (azione.equals("rimuoviMessaggio")) {
                    azioneRimuoviMessaggio(request, response);
                } else if (azione.equals("modificaRecensioneInternaAus")) {
                    azioneModificaRecensioneInternaAus(request, response);
                } else if (azione.equals("modificaRecensioneInterna")) {
                    azioneModificaRecensioneInterna(request, response);
                } else if (azione.equals("preparaModificaRecInterna") || azione.equals("aggiungiImmagineRecensioneM") || azione.equals("rimuoviImmagineRecensioneM") || azione.equals("aggiungiProM") || azione.equals("rimuoviProM") || azione.equals("aggiungiControM") || azione.equals("rimuoviControM")) {
                    azionePreparaModificaRecInterna(request, response);
                } else if (azione.equals("cancellaRecensione")) {
                    azioneCancellaRecensione(request, response);
                } else if (azione.equals("cancellaRecensioneInterna")) {
                    azioneCancellaRecensioneInterna(request, response);
                } else if (azione.equals("aggiungiRecensioneEsterna")) {
                    azioneAggiungiRecensioneEsterna(request, response);
                } else if (azione.equals("aggiungiRecensioneEsternaAus")) {
                    azioneAggiungiRecensioneEsternaAus(request, response);
                } else if (azione.equals("modificaRecensioneEsternaAus")) {
                    azioneModificaRecensioneEsternaAus(request, response);
                } else if (azione.equals("modificaRecensioneEsterna")) {
                    azioneModificaRecensioneEsterna(request, response);
                } else if (azione.equals("preparaModificaRecEsterna")) {
                    azionePreparaModificaRecEsterna(request, response);
                } else if (azione.equals("cancellaRecensioneEsterna")) {
                    azioneCancellaRecensioneEsterna(request, response);
                } else if (azione.equals("visualizzaRecensioniInterne")) {
                    azioneVisualizzaRecensioniInterne(request, response);
                } else if (azione.equals("visualizzaRecensioniEsterne")) {
                    azioneVisualizzaRecensioniEsterne(request, response);
                } else if (azione.equals("visualizzaRecensione")) {
                    azioneVisualizzaRecensione(request, response);
                } else if (azione.equals("visualizzaNotizia")) {
                    azioneVisualizzaNotizia(request, response);
                } else if (azione.equals("aggiungiVotoAus")) {
                    azioneAggiungiVotoAus(request, response);
                } else if (azione.equals("abilitaUtente")) {
                    azioneAbilitaUtente(request, response);
                } else if (azione.equals("aggiungiVoto")) {
                    azioneAggiungiVoto(request, response);
                } else {
                    request.setAttribute("messageError", "errore! valore button invalido");
                    rd = sc.getRequestDispatcher("/error.jsp");
                    rd.forward(request, response);
                }
            }
        } catch (Exception e) {
            request.setAttribute("messageError", e.getMessage());
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        } finally {
            out.close();
        }
    }

    /**
     * Creare gli amministratori del sistema avviato nella prima volta
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     * @throws NoSuchAlgorithmException se si verifica un errore nell'algoritmo
     * di crittografia
     */
    private void azioneAggiungiAdministrators(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException, NoSuchAlgorithmException {
        sc = getServletContext();
        rd = null;
        session = request.getSession(true);
        session.setMaxInactiveInterval(60 * 60 * 24);
        int index = sc.getRealPath("/").indexOf("\\dist\\");
        appPath = sc.getRealPath("/").substring(0, index) + "\\EnterpriseApplication12-13-war\\web\\";
        MessageDigest m = MessageDigest.getInstance("MD5");
        List<Notizia> notizie = gestoreNotiziaBean.visualizzaNotizie();
        for (Notizia n : notizie) {
            String pathTesto = n.getTesto();
            int index1 = pathTesto.indexOf("\\elencoNotizie\\");
            pathTesto = appPath + pathTesto.substring(index1 + 1, pathTesto.length());
            gestoreNotiziaBean.aggiorna(n.getTitolo(), pathTesto, n.getData(), n.getListPiattaforme(), n.getImmaginePath());
        }

        List<RecensioneInterna> recI = gestoreRecensioniBean.visualizzaRecensioniInterne();
        for (RecensioneInterna r : recI) {
            String pathTesto = r.getTesto();
            int index1 = pathTesto.indexOf("\\elencoRecensioni\\");
            pathTesto = appPath + pathTesto.substring(index1 + 1, pathTesto.length());
            gestoreRecensioniBean.modificaRecensioneInterna(r.getTitolo(), r.getPro(), r.getContro(), pathTesto, r.getImmagini());
        }
        boolean administratorsAggiunti = false;
        if (!administratorsAggiunti) {
            m.update("1111".getBytes());

            Utente utenteAttuale1 = gestoreUtenteBean.addAdministrator("nabil", "allam", "nabil_allam", String.format("%032x", new BigInteger(1, m.digest())), "nabil2802@gmail.com");
            m.update("2222".getBytes());
            Utente utenteAttuale2 = gestoreUtenteBean.addAdministrator("luca", "canensi", "aaaa", String.format("%032x", new BigInteger(1, m.digest())), "aaaa");
            m.update("3333".getBytes());
            Utente utenteAttuale3 = gestoreUtenteBean.addAdministrator("roberto", "cotrino", "bbbb", String.format("%032x", new BigInteger(1, m.digest())), "bbbb");
            m.update("4444".getBytes());
            Utente utenteAttuale4 = gestoreUtenteBean.addAdministrator("giuseppe", "saglia", "dddd", String.format("%032x", new BigInteger(1, m.digest())), "dddd");
            if ((utenteAttuale1 != null) && (utenteAttuale2 != null) && (utenteAttuale3 != null) && (utenteAttuale4 != null)) {
                   azioneHome(request,response);
            } else {
                List<Utente> administrators = gestoreUtenteBean.mostraElenco("", "", "a", "");//va bene anche senza "a" siccome username e' univoco
                //List <Utente> administrators = gestoreUtenteBean.trovaTutti();
                List<String> usernames = new LinkedList<String>();
                Utente a;
                List<String> colletionUsers = new LinkedList<String>();
                colletionUsers.add("nabil_allam");
                colletionUsers.add("aaaa");
                colletionUsers.add("bbbb");
                colletionUsers.add("dddd");
                for (int i = 0; i < administrators.size(); i++) {
                    a = administrators.get(i);
                    usernames.add(a.getUsername());
                }
                if (usernames.containsAll(colletionUsers)) {

                    azioneHome(request,response);
                } else {
                    request.setAttribute("messageError", "inserimento administrators e' fallito");
                    rd = sc.getRequestDispatcher("/error.jsp");
                    rd.forward(request, response);
                }
            }
            administratorsAggiunti = true;
        }

        
        

    }

    /**
     * Redirege user alla pagina di registrazione
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneRegistrazione(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        sc = getServletContext();
        rd = null;
        rd = sc.getRequestDispatcher("/register.jsp");
        rd.forward(request, response);
    }

    /**
     * Effettua la registrazione di un utente sul database
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     * @throws NoSuchAlgorithmException se si verifica un errore nell'algoritmo
     * di crittografia
     */
    private void azioneRegistrazioneUtente(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException, NoSuchAlgorithmException {
        sc = getServletContext();
        rd = null;
        session = request.getSession(true);
        session.setMaxInactiveInterval(60 * 60 * 24);
        MessageDigest m = MessageDigest.getInstance("MD5");
        Utente utenteAttuale;
        String nome = request.getParameter("nome");
        String cognome = request.getParameter("cognome");
        String username = request.getParameter("username");
        String pwd = request.getParameter("pwd");
        String eMail = request.getParameter("eMail");
        String social = request.getParameter("type");
        String tipo = "u";
        String attivo = "s";
        if (pwd != null) {
            m.update(pwd.getBytes());
            pwd = String.format("%032x", new BigInteger(1, m.digest()));
            utenteAttuale = gestoreUtenteBean.addUtente(nome, cognome, username, pwd, eMail, tipo, attivo);
        } else {
            utenteAttuale = gestoreUtenteBean.addUtente(nome, cognome, username, pwd, eMail, tipo, attivo, social);
        }
        if (utenteAttuale != null) {
            azioneLogin(request, response);
        } else {
            rd = sc.getRequestDispatcher("/register.jsp");
            rd.forward(request, response);
        }
    }

    /**
     * Metodo ausiliario che porta alla pagina dell'aggiunta del recensore da
     * parte di un amministratore
     *
     * @param request
     * @param response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneAggiungiRecensoreAus(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        sc = getServletContext();
        rd = null;
        rd = sc.getRequestDispatcher("/addReviewer.jsp");
        rd.forward(request, response);
    }

    /**
     * Metodo ausiliario che porta alla pagina dell'aggiunta della
     * RecensioneInterna da parte di un recensore
     *
     * @param request
     * @param response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneAggiungiRecensioneInternaAus(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        sc = getServletContext();
        rd = null;
        List<Piattaforma> l = piattaformaFacade.findAll();
        List<Videogame> videogiochi = gestoreVideogameBean.findVideogame();
        request.setAttribute("listPiattaforme", l);
        request.setAttribute("listVideogiochi", videogiochi);
        rd = sc.getRequestDispatcher("/addInternalReview.jsp");
        rd.forward(request, response);
    }

    /**
     * Metodo che porta alla pagina della gestione dei Videogames
     *
     * @param request
     * @param response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneVisualizzaModificaCancellaVideogioco(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        sc = getServletContext();
        rd = null;
        List<Videogame> videogiochi = gestoreVideogameBean.findVideogame();
        session.setAttribute("listVideogiochi", videogiochi);
        rd = sc.getRequestDispatcher("/videogames.jsp");
        rd.forward(request, response);
    }

    /**
     * Metodo che porta alla pagina della gestione dei Articoli usati
     *
     * @param request
     * @param response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneModificaCancellaArtUsati(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        sc = getServletContext();
        rd = null;
        List<ArticoloUsato> artUsati = new LinkedList<ArticoloUsato>();
        String daConfermare = request.getParameter("confirm");

        if (daConfermare.equals("n")) {
            artUsati = gestoreArticoloBean.cercaArticoliUsatiAdmin();
            System.out.println("arftUsati = " + artUsati.toString());
        } else if (daConfermare.equals("s")) {
            artUsati = (List<ArticoloUsato>) session.getAttribute("usatiDaConfermare");
        }
        System.out.println("Prima di leggere artUsati");
        session.setAttribute("listArticleUsed", artUsati);
        System.out.println("Dopo leggere artUsati");
        rd = sc.getRequestDispatcher("/listArticleUsed.jsp");
        rd.forward(request, response);
    }

    /**
     * Metodo ausiliario che porta alla pagina dell'aggiunta del Videogame da
     * parte di un amministratore
     *
     * @param request
     * @param response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneAggiungiVideogiocoAus(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        sc = getServletContext();
        rd = null;
        List<Piattaforma> l = piattaformaFacade.findAll();
        request.setAttribute("listPiattaforme", l);
        rd = sc.getRequestDispatcher("/addVideogame.jsp");
        rd.forward(request, response);
    }

    /**
     * Metodo ausiliario che porta alla pagina della modifica del Videogame da
     * parte di un amministratore
     *
     * @param request
     * @param response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneModificaVideogiocoAus(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        sc = getServletContext();
        rd = null;
        List<Videogame> videogiochi = (List<Videogame>) session.getAttribute("listVideogiochi");
        // session.removeAttribute("listVideogiochi");
        Videogame v = null;
        boolean trovato = false;
        String id = request.getParameter("id");
        Iterator<Videogame> i = videogiochi.iterator();
        while (i.hasNext() && !trovato) {
            v = i.next();
            if (v.getId().toString().equals(id)) {
                trovato = true;
            } else {
                v = null;
            }

        }
        if (v != null) {
            request.setAttribute("videogame", v);
        }
        rd = sc.getRequestDispatcher("/modifyVideogame.jsp");
        rd.forward(request, response);
    }

    /**
     * Aggiungere i dati di un recensore al DB da parte di un amministratore
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     * @throws NoSuchAlgorithmException se si verifica un errore nell'algoritmo
     * di crittografia
     */
    private void azioneAggiungiRecensore(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException, NoSuchAlgorithmException {
        sc = getServletContext();
        rd = null;
        session = request.getSession(true);
        session.setMaxInactiveInterval(60 * 60 * 24);
        Utente utenteAttuale = (Utente) session.getAttribute("utente");
        if (utenteAttuale != null) {
            if (utenteAttuale.getTipo().equals("a")) {
                String nome = request.getParameter("nome");
                String cognome = request.getParameter("cognome");
                String username = request.getParameter("username");
                String pwd = request.getParameter("pwd");
                MessageDigest m = MessageDigest.getInstance("MD5");
                m.update(pwd.getBytes());
                pwd = String.format("%032x", new BigInteger(1, m.digest()));
                String eMail = request.getParameter("eMail");
                String tipo = "r";
                String attivo = "s";
                Utente recensore = gestoreUtenteBean.addUtente(nome, cognome, username, pwd, eMail, tipo, attivo);
                if (recensore != null) {
                    request.setAttribute("messageError", "azione compiuta con successo");
                    rd = sc.getRequestDispatcher("/success.jsp");
                    //rd = sc.getRequestDispatcher("/administrator.jsp");
                    rd.forward(request, response);
                } else {
                    request.setAttribute("messageError", "Operazione non riuscita!inserimento recensore e' fallito");
                    rd = sc.getRequestDispatcher("/error.jsp");
                    //rd = sc.getRequestDispatcher("/administrator.jsp");
                    rd.forward(request, response);
                }
            } else {
                request.setAttribute("messageError", "Operazione non riuscita!non sei un administrator");
                rd = sc.getRequestDispatcher("/error.jsp");
                rd.forward(request, response);
            }
        } else {
            request.setAttribute("messageError", "Operazione non riuscita!Non si dispone dei privilegi necessari per accedere alla pagina richiesta");
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }

    }

    /**
     * Visualizza tutti i recensori attivi presenti nel DB
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneVisualizzaRecensori(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        sc = getServletContext();
        rd = null;
        session = request.getSession(true);
        session.setMaxInactiveInterval(60 * 60 * 24);
        List<Utente> recensori = gestoreUtenteBean.mostraElenco("", "", "r", "s");
        System.out.println("Recensori attuali = " + recensori.toString());
        request.setAttribute("recensori", recensori);
        rd = sc.getRequestDispatcher("/listRecensori.jsp");
        rd.forward(request, response);
    }

    /**
     * Visualizza tutti i recensori e utenti generici presenti nel DB
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneVisualizzaUtenti(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        sc = getServletContext();
        rd = null;
        session = request.getSession(true);
        session.setMaxInactiveInterval(60 * 60 * 24);
        List<Utente> recensori = gestoreUtenteBean.mostraElenco("", "", "r", "s");
        List<Utente> users = gestoreUtenteBean.mostraElenco("", "", "u", "s");
        List<Utente> disable = gestoreUtenteBean.mostraElenco("", "", "u", "n");
        request.setAttribute("recensori", recensori);
        request.setAttribute("users", users);
        request.setAttribute("disable", disable);
        rd = sc.getRequestDispatcher("/listUtenti.jsp");
        rd.forward(request, response);
    }

    /**
     * Cancella o disabilita un recensore da parte di un amministratore
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneCancellaRecensore(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        sc = getServletContext();
        rd = null;
        session = request.getSession(true);
        session.setMaxInactiveInterval(60 * 60 * 24);
        Utente utenteAttuale = (Utente) session.getAttribute("utente");
        if (utenteAttuale != null) {
            if (utenteAttuale.getTipo().equals("a")) {
                Long idRecensore = Long.parseLong(request.getParameter("idRecensore"));
                Utente recensoreDaCancellare = gestoreUtenteBean.trova(idRecensore);
                if (recensoreDaCancellare != null) {
                    if (!recensoreDaCancellare.getTipo().equals("a")) {

                        System.out.println("Recensore da cancellare =" + recensoreDaCancellare.toString());
                        if (gestoreUtenteBean.elimina(recensoreDaCancellare)) {
                            rd = sc.getRequestDispatcher("/Controller?button=visualizzaRecensori");
                            rd.forward(request, response);
                        } else {
                            request.setAttribute("messageError", "Operazione non riuscita!cancellazione recensore fallita");
                            rd = sc.getRequestDispatcher("/error.jsp");
                            rd.forward(request, response);
                        }
                    } else {
                        request.setAttribute("messageError", "Operazione non riuscita!Non si puo' cancellare un administrator");
                        rd = sc.getRequestDispatcher("/error.jsp");
                        rd.forward(request, response);
                    }
                } else {
                    request.setAttribute("messageError", "Operazione non riuscita!utente non trovato");
                    rd = sc.getRequestDispatcher("/error.jsp");
                    rd.forward(request, response);
                }
            } else {
                request.setAttribute("messageError", "Operazione non riuscita!non sei un administrator");
                rd = sc.getRequestDispatcher("/error.jsp");
                rd.forward(request, response);
            }
        } else {
            request.setAttribute("messageError", "Operazione non riuscita!Non si dispone dei privilegi necessari per accedere alla pagina richiesta");
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }



    }

    /**
     * Cancella o disabilita un utente generico da parte di un amministratore
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneCancellaUtente(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        sc = getServletContext();
        rd = null;
        session = request.getSession(true);
        session.setMaxInactiveInterval(60 * 60 * 24);
        Utente utenteAttuale = (Utente) session.getAttribute("utente");
        if (utenteAttuale != null) {
            if (utenteAttuale.getTipo().equals("a")) {
                Long idUser = Long.parseLong(request.getParameter("idUser"));
                Utente userDaCancellare = gestoreUtenteBean.trova(idUser);
                if (userDaCancellare != null) {
                    if (!userDaCancellare.getTipo().equals("a")) {

                        if (gestoreUtenteBean.elimina(userDaCancellare)) {
                            rd = sc.getRequestDispatcher("/Controller?button=visualizzaUtenti");
                            rd.forward(request, response);
                        } else {
                            request.setAttribute("messageError", "Operazione non riuscita!cancellazione utente e' fallita");
                            rd = sc.getRequestDispatcher("/error.jsp");
                            rd.forward(request, response);
                        }

                    } else {
                        request.setAttribute("messageError", "Operazione non riuscita!Non si puo' cancellare un administrator");
                        rd = sc.getRequestDispatcher("/error.jsp");
                        rd.forward(request, response);
                    }
                } else {
                    request.setAttribute("messageError", "Operazione non riuscita!utente non trovato");
                    rd = sc.getRequestDispatcher("/error.jsp");
                    rd.forward(request, response);
                }
            } else {
                request.setAttribute("messageError", "Operazione non riuscita!non sei un administrator");
                rd = sc.getRequestDispatcher("/error.jsp");
                rd.forward(request, response);
            }
        } else {
            request.setAttribute("messageError", "Operazione non riuscita!Non si dispone dei privilegi necessari per accedere alla pagina richiesta");
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }



    }

    /**
     * Metodo ausiliario che porta alla pagina di modifica dati di un utente
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneModificaUtenteAus(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        sc = getServletContext();
        rd = null;
        Utente utenteAttuale = (Utente) session.getAttribute("utente");
        if (utenteAttuale.getSocial() == null) {
            rd = sc.getRequestDispatcher("/modifiedProfile.jsp");
        } else {
            request.setAttribute("messageError", "Operazione non riuscita!Non si dispone dei privilegi necessari per accedere alla pagina richiesta");
            rd = sc.getRequestDispatcher("/error.jsp");
        }
        rd.forward(request, response);
    }

    /**
     * Metodo ausiliario che porta alla pagina dell'aggiunta piattaforma da
     * parte di un amministratore
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneAggiungiPiattaformaAus(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        sc = getServletContext();
        rd = null;
        rd = sc.getRequestDispatcher("/addPlatform.jsp");
        rd.forward(request, response);
    }

    /**
     * Un utente effettua la modifica dei suoi dati sul database
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     * @throws NoSuchAlgorithmException se si verifica un errore nell'algoritmo
     * di crittografia
     */
    private void azioneModificaUtente(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException, NoSuchAlgorithmException {
        sc = getServletContext();
        rd = null;
        session = request.getSession(true);
        session.setMaxInactiveInterval(60 * 60 * 24);
        Utente utenteAttuale = (Utente) session.getAttribute("utente");
        if (utenteAttuale != null && utenteAttuale.getSocial() == null) {
            String nome = request.getParameter("nome");
            String cognome = request.getParameter("cognome");
            MessageDigest m = MessageDigest.getInstance("MD5");
            String oldpwd = request.getParameter("oldpwd");
            m.update(oldpwd.getBytes());
            oldpwd = String.format("%032x", new BigInteger(1, m.digest()));
            String newpwd = request.getParameter("pwd");

            m.update(newpwd.getBytes());
            newpwd = String.format("%032x", new BigInteger(1, m.digest()));
            String eMail = request.getParameter("eMail");
            String username = utenteAttuale.getUsername();
            String tipo = utenteAttuale.getTipo();
            String social = utenteAttuale.getSocial();
            Utente utenteAggiornato = gestoreUtenteBean.aggiorna(nome, cognome, username, oldpwd, newpwd, eMail, tipo, "s", social);

            if (utenteAggiornato != null) {
                session.setAttribute("utente", utenteAggiornato);
                azioneHome(request,response);
                
            } else {
                request.setAttribute("messageError", "Operazione non riuscita!La password specificata non e' corretta");
                rd = sc.getRequestDispatcher("/error.jsp");
                rd.forward(request, response);
            }
        } else {
            request.setAttribute("messageError", "Operazione non riuscita!Non si dispone dei privilegi necessari per accedere alla pagina richiesta");
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }
    }

    /**
     * Metodo ausiliario che porta alla pagina della disibilitazione di un
     * utente
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneRimuoviUtenteAus(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        session = request.getSession();
        session.setMaxInactiveInterval(60 * 60 * 24);
        List l = gestoreUtenteBean.trovaTutti();
        // invoca il metodo mostraelencoUtenti con sottostring a
        session.setAttribute("elencoUtenti", l);
        rd = sc.getRequestDispatcher("/removeUser.jsp");
        rd.forward(request, response);
    }

    /**
     * Un Amministratore effettua la cancellazione dei dati di un utente dal DB
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneRimuoviUtente(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        sc = getServletContext();
        rd = null;
        session = request.getSession(true);
        session.setMaxInactiveInterval(60 * 60 * 24);
        Utente utenteAttuale = (Utente) session.getAttribute("utente");
        if (utenteAttuale != null) {
            if (utenteAttuale.getTipo().equals("a")) {
                long idUtente = Long.parseLong(request.getParameter("idUtente"));
                Utente utente = gestoreUtenteBean.trova(idUtente);
                if (utente != null) {
                    if (!utente.getTipo().equals("a")) {
                        if (gestoreUtenteBean.elimina(utente)) {
                            // nella calsse Utente e al posto di cancellare utente viene settato l'attributo attivo da "s" a "n".                                                        
                            request.setAttribute("messageError", "azione compiuta con successo");
                            rd = sc.getRequestDispatcher("/success.jsp");
                            rd.forward(request, response);
                        } else {
                            request.setAttribute("messageError", "Operazione non riuscita!cancellazione utente e' fallita");
                            rd = sc.getRequestDispatcher("/error.jsp");
                            rd.forward(request, response);
                        }
                    } else {
                        request.setAttribute("messageError", "Operazione non riuscita!Non si puo' cancellare un administrator");
                        rd = sc.getRequestDispatcher("/error.jsp");
                        rd.forward(request, response);
                    }
                } else {
                    request.setAttribute("messageError", "Operazione non riuscita!utente non trovato");
                    rd = sc.getRequestDispatcher("/error.jsp");
                    rd.forward(request, response);
                }
            } else {
                request.setAttribute("messageError", "Operazione non riuscita!non sei un administrator");
                rd = sc.getRequestDispatcher("/error.jsp");
                rd.forward(request, response);
            }
        } else {
            request.setAttribute("messageError", "Operazione non riuscita!Non si dispone dei privilegi necessari per accedere alla pagina richiesta");
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }
    }

    /**
     * Effettua il login
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     * @throws NoSuchAlgorithmException se si verifica un errore nell'algoritmo
     * di crittografia
     */
    private void azioneLogin(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException, NoSuchAlgorithmException {
        session = request.getSession();
        session.setMaxInactiveInterval(60 * 60 * 24);
        String type = request.getParameter("type");
        String username = request.getParameter("username");
        String pwd = null;
        if (type == null) {
            pwd = request.getParameter("pwd");
            MessageDigest m = MessageDigest.getInstance("MD5");
            m.update(pwd.getBytes());
            pwd = String.format("%032x", new BigInteger(1, m.digest()));
        }

        Utente utenteAttuale = gestoreUtenteBean.login(username, pwd, type);
        if (utenteAttuale != null) {
            if (utenteAttuale.getAttivo().equals("s")) {
                session.setAttribute("utente", utenteAttuale);
                List<ArticoloUsato> usatiDaConfermare = gestoreArticoloBean.cercaArticoliUsatiDaConfermare();
                System.out.println("usati da confermare = " + usatiDaConfermare);
                session.setAttribute("usatiDaConfermare", usatiDaConfermare);
                List<ArticoloNuovo> carrello = new LinkedList<ArticoloNuovo>();
                session.setAttribute("carrello", carrello);
                List<Messaggio> messDaLeggere = (List<Messaggio>) gestoreMessaggioBean.estraiMessaggiDaLeggere(utenteAttuale);
                session.setAttribute("messDaleggere", messDaLeggere);
                List<Messaggio> mailboxRicevuti = (List<Messaggio>) gestoreMessaggioBean.estraiMessaggiRicevuti(utenteAttuale);
                session.setAttribute("mailboxRicevuti", mailboxRicevuti);
                azioneHome(request,response);
            } else {
                request.setAttribute("messageError", "Username esistente ma non attiva");
                rd = sc.getRequestDispatcher("/error.jsp");
                rd.forward(request, response);
            }
        } else if (type != null) {
            azioneRegistrazioneUtente(request, response);
        } else {
            request.setAttribute("messageError", "Operazione non riuscita! Username e/o password inseriti errati");
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }
    }

    /**
     * Effettua il logout: la sessione corrente viene invalidata
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneLogout(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        session = request.getSession();
        session.setMaxInactiveInterval(60 * 60 * 24);
        Enumeration attr = session.getAttributeNames();
        while (attr.hasMoreElements()) {
            session.removeAttribute((String) attr.nextElement());
        }
        session.invalidate();
        azioneHome(request,response);
    }

    /**
     * Mostra l'elenco degli utenti
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneMostraElencoUtenti(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        session = request.getSession();
        session.setMaxInactiveInterval(60 * 60 * 24);
        String username = request.getParameter("username");
        String eMail = request.getParameter("eMail");
        String tipo = request.getParameter("tipo");
        String attivo = request.getParameter("attivo");
        if (username == null) {
            username = "";
        }
        if (eMail == null) {
            eMail = "";
        }
        if (tipo == null) {
            tipo = "";
        }
        if (attivo == null) {
            attivo = "";
        }

        List l = gestoreUtenteBean.mostraElenco(username, eMail, tipo, attivo);
        session.setAttribute("elencoUtenti", l);
        rd = sc.getRequestDispatcher("/elencoUtenti.jsp");
        rd.forward(request, response);
    }

    /**
     * Mostra l'elenco degli utenti
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneMostraElencoUtentiCompleto(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        session = request.getSession();
        session.setMaxInactiveInterval(60 * 60 * 24);
        List l = gestoreUtenteBean.trovaTutti();
        session.setAttribute("elencoUtenti", l);
        rd = sc.getRequestDispatcher("/elencoUtenti.jsp");
        rd.forward(request, response);
    }

    /**
     * Aggiungere i dati di una piattaforma al DB da parte di un amministratore
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneAggiungiPiattaforma(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        sc = getServletContext();
        rd = null;
        session = request.getSession(true);
        session.setMaxInactiveInterval(60 * 60 * 24);
        Utente utenteAttuale = (Utente) session.getAttribute("utente");
        if (utenteAttuale != null) {
            if (utenteAttuale.getTipo().equals("a")) {
                String piattaforma = request.getParameter("piattaforma");
                Piattaforma p = new Piattaforma();
                p.setNome(piattaforma);
                if (!piattaformaFacade.PiattaformaEsistente(p)) {
                    piattaformaFacade.create(p);
                    rd = sc.getRequestDispatcher("/Controller?button=visualizzaPiattaforme");
                    rd.forward(request, response);
                } else {
                    request.setAttribute("messageError", "Operazione non riuscita!piattaforma gia presente");
                    rd = sc.getRequestDispatcher("/error.jsp");
                    rd.forward(request, response);
                }
            } else {
                request.setAttribute("messageError", "Operazione non riuscita!non sei un administrator");
                rd = sc.getRequestDispatcher("/error.jsp");
                rd.forward(request, response);
            }
        } else {
            request.setAttribute("messageError", "Operazione non riuscita!Non si dispone dei privilegi necessari per accedere alla pagina richiesta");
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }


    }

    /**
     * Mostra l'elenco delle piattaforme
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneVisualizzaPiattaforme(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        sc = getServletContext();
        rd = null;
        List<Piattaforma> piattaforme = piattaformaFacade.findAll();
        if (!piattaforme.isEmpty()) {
            request.setAttribute("piattaforme", piattaforme);
        } else {
            request.setAttribute("piattaforme", new LinkedList<Piattaforma>());
        }
        rd = sc.getRequestDispatcher("/listPiattaforme.jsp");
        rd.forward(request, response);
    }

    /**
     * Cancellazione di una piattaforma da parte di un amministratore
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneCancellaPiattaforme(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        sc = getServletContext();
        rd = null;
        String idPiattaforma = request.getParameter("idPiattaforma");
        Long idPiattaformaLong = Long.parseLong(idPiattaforma);
        Piattaforma piattaforma = piattaformaFacade.find(idPiattaformaLong);
        piattaformaFacade.remove(piattaforma);
        rd = sc.getRequestDispatcher("/Controller?button=visualizzaPiattaforme");
        rd.forward(request, response);
    }

    /**
     * Metodo ausiliario che porta alla pagina per aggiungere una notizia da
     * parte di un recensore
     *
     * @param request
     * @param response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneAggiungiNotiziaAus(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        sc = getServletContext();
        rd = null;
        session = request.getSession(true);
        session.setMaxInactiveInterval(60 * 60 * 24);
        List<Piattaforma> l = piattaformaFacade.findAll();
        request.setAttribute("listPiattaforme", l);
        rd = sc.getRequestDispatcher("/addNews.jsp");
        rd.forward(request, response);
    }

    /**
     * Aggiungere i dati di una notizia al DB da parte di un recensore
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     * @throws ParseException se si verifica un errore in modo imprevisto
     * durante l'analisi o la parsificazione
     */
    private void azioneAggiungiNotizia(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, ParseException {
        sc = getServletContext();
        rd = null;
        session = request.getSession(true);
        session.setMaxInactiveInterval(60 * 60 * 24);
        Utente utenteAttuale = (Utente) session.getAttribute("utente");
        if (utenteAttuale != null) {
            if (utenteAttuale.getTipo().equals("r")) {
                String titolo = request.getParameter("titolo");
                titolo=new String(titolo.getBytes(Charset.forName("ISO-8859-1")),Charset.forName("UTF-8"));
                String testo = pathTestoInserito(request, response, "n");
                List<String> listaPiattaforme = new LinkedList();
                String piattaforma;
                int np = new Integer(request.getParameter("numeroPiatt"));
                for (int i = 1; i <= np; i++) {
                    piattaforma = request.getParameter("piattaforma" + i);
                    if (piattaforma != null) {
                        listaPiattaforme.add(piattaforma);
                    }
                }
                //List<String> listaPiattaforme = (List<String>)request.getParameter("");// o session.get...
                String immaginePath = request.getParameter("immaginePath");
                immaginePath = "./img/" + immaginePath;
                GregorianCalendar gc = new GregorianCalendar();
                SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");//e non mm minuscule che rappresentano minuti
                Date data = dateFormat.parse(dateFormat.format(gc.getTime()));
                List<Piattaforma> l = piattaformaFacade.findAll();
                List<Piattaforma> lista = new LinkedList();
                for (Piattaforma p : l) {
                    for (String nomeP : listaPiattaforme) {
                        if (p.getNome().equals(nomeP)) {
                            lista.add(p);
                        }
                        //if(p.getNome().equals(piattaforma.toUpperCase())) lista.add(p);
                    }
                }
                if (!lista.isEmpty()) {
                    Notizia notiziaAggiunta = gestoreNotiziaBean.addNotizia(titolo, testo, utenteAttuale, data, lista, immaginePath);
                    //Notizia notiziaAggiunta = gestoreNotiziaBean.addNotizia(titolo, testo, utenteAttuale, Calendar.getInstance().getTime(),lista,immaginePath);
                    if (notiziaAggiunta != null) {
                        rd = sc.getRequestDispatcher("/Controller?button=modificaNotiziaAus");
                        rd.forward(request, response);
                    } else {
                        request.setAttribute("messageError", "Operazione non riuscita!inserimento notizia e' fallito");
                        rd = sc.getRequestDispatcher("/error.jsp");
                        rd.forward(request, response);
                    }
                } else {
                    request.setAttribute("messageError", "Operazione non riuscita!nome piattaforma non e' presente");
                    rd = sc.getRequestDispatcher("/error.jsp");
                    rd.forward(request, response);
                }
            } else {
                request.setAttribute("messageError", "Operazione non riuscita!non sei un recensore");
                rd = sc.getRequestDispatcher("/error.jsp");
                rd.forward(request, response);
            }
        } else {
            request.setAttribute("messageError", "Operazione non riuscita!Non si dispone dei privilegi necessari per accedere alla pagina richiesta");
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }
    }

    /**
     * Aggiungere un videogame al DB da parte di un amministratore
     *
     * @param request servlet request
     * @param response servlet response
     * @throws Exception se si verifica un eccezione
     */
    private void azioneAggiungiVideogioco(HttpServletRequest request, HttpServletResponse response) throws Exception {
        sc = getServletContext();
        rd = null;
        session = request.getSession(true);
        session.setMaxInactiveInterval(60 * 60 * 24);
        Utente utenteAttuale = (Utente) session.getAttribute("utente");

        if (utenteAttuale != null) {
            if (utenteAttuale.getTipo().equals("a")) {
                String nome = request.getParameter("nome");
                String genere = request.getParameter("genere");
                String sviluppatore = request.getParameter("sviluppatore");
                String distributore = request.getParameter("distributore");
                String giocatori = request.getParameter("numGiocatori");
                int numG = -1;
                if (giocatori != null && !giocatori.equals("")) {
                    numG = new Integer(giocatori);
                }
                int ni = new Integer(request.getParameter("numeroImm"));
                String[] immaginiPath = new String[ni];
                Piattaforma[] piattaforme = new Piattaforma[ni];
                // request.setAttribute("messageError", "fino a qui arrivasdsasdsd");
                //String dataStr = request.getParameter("data");
                //SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");//e non mm minuscule che rappresentano minuti
                Date data = null; //dateFormat.parse(dataStr);
                //Object m=session.getAttribute("mc");
                ManageCalendar mc = (ManageCalendar) session.getAttribute("mc");//controlla calendario in sessione

                try {
                    if (mc == null) {
                        mc = new ManageCalendar("One-Hit Kills Release Date Calender");


                        //Thread.sleep(3000);
                        session.setAttribute("mc", mc);
                    }

                    data = mc.getDateVideogame(nome);
                    /*else{
                     mc=(ManageCalendar)m;
                     }*/

                } catch (com.google.gdata.util.AuthenticationException e) {
                    mc = null;
                    data = null;
                }

                String multiplayer = request.getParameter("multi");
                boolean multi = true;
                if (multiplayer.equals("No")) {
                    multi = false;
                }
                String pegi = request.getParameter("PEGI");
                Voto v = new Voto();
                v.setScala(10);
                v.setValutazione(-1.0);


                boolean aggiunti = false;
                List<Videogame> videogameAggiunti = new ArrayList<Videogame>();
                for (int i = 1; i <= ni; i++) {
                    piattaforme[i - 1] = piattaformaFacade.esiste(request.getParameter("piattaforma" + i));
                    immaginiPath[i - 1] = request.getParameter("pathImmagine" + i);

                    request.setAttribute("messageError", immaginiPath[i - 1]);
                    Videogame vAggiunta = gestoreVideogameBean.aggiungiVideogame(nome, genere, numG, multi, data, piattaforme[i - 1], sviluppatore, distributore, null, immaginiPath[i - 1], pegi);
                    if (vAggiunta != null) {
                        videogameAggiunti.add(vAggiunta);
                    }
                }
                if (videogameAggiunti.size() == ni) {
                    request.setAttribute("messageError", "tutti i videogiochi sono stati inseriti corrrettamente");
                    rd = sc.getRequestDispatcher("/Controller?button=visualizzaModificaCancellaVideogioco");
                    rd.forward(request, response);
                } else {
                    if (videogameAggiunti.isEmpty()) {
                        request.setAttribute("messageError", "Operazione non riuscita! Nessun videogioco e' stato inserito ");
                    } else {
                        String error = "Attenzione!! e stato inserito il videogioco solo per le seguenti piattaforme: ";
                        for (Videogame vi : videogameAggiunti) {
                            error = error + " " + vi.getPiattaforma().getNome() + " ";
                        }
                        request.setAttribute("messageError", error);
                    }
                    rd = sc.getRequestDispatcher("/error.jsp");
                    rd.forward(request, response);

                }
            } else {
                request.setAttribute("messageError", "Operazione non riuscita!non sei un amministratore");
                rd = sc.getRequestDispatcher("/error.jsp");
                rd.forward(request, response);
            }
        } else {
            request.setAttribute("messageError", "Operazione non riuscita!Non si dispone dei privilegi necessari per accedere alla pagina richiesta");
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }
    }

    /**
     * Modifica di un videogame da parte di un amministratore
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     * @throws ParseException se si verifica un errore in modo imprevisto
     * durante l'analisi o la parsificazione
     */
    private void azioneModificaVideogioco(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, ParseException {
        sc = getServletContext();
        rd = null;
        session = request.getSession(true);
        session.setMaxInactiveInterval(60 * 60 * 24);
        Utente utenteAttuale = (Utente) session.getAttribute("utente");

        if (utenteAttuale != null) {
            if (utenteAttuale.getTipo().equals("a")) {
                String nome = request.getParameter("nome");
                String genere = request.getParameter("genere");
                String sviluppatore = request.getParameter("sviluppatore");
                String distributore = request.getParameter("distributore");
                String giocatori = request.getParameter("numGiocatori");
                Integer numG = -1;
                if (giocatori != null && !giocatori.equals("")) {
                    numG = new Integer(giocatori);
                }
                String immaginePath = request.getParameter("immaginePath");
                String piattaforma = request.getParameter("piattaforma");
                Long id = new Long(request.getParameter("id"));
                String dataStr = request.getParameter("data");
                Date data;
                if(!dataStr.equals("")){
                    SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");//e non mm minuscule che rappresentano minuti
                    data = dateFormat.parse(dataStr);
                }
                else
                    data=null;
                String multiplayer = request.getParameter("multi");
                boolean multi = true;
                if (multiplayer.equals("No")) {
                    multi = false;
                }
                String pegi = request.getParameter("PEGI");

                try {

                    gestoreVideogameBean.modificaVideogame(id, nome, genere, numG, multi, data, piattaformaFacade.esiste(piattaforma), sviluppatore, distributore, immaginePath, pegi);
                    request.setAttribute("messageError", "azione compiuta con successo");
                    rd = sc.getRequestDispatcher("/Controller?button=visualizzaModificaCancellaVideogioco");
                    rd.forward(request, response);
                } catch (Exception e) {
                    request.setAttribute("messageError", id + " " + nome + " " + genere + " " + numG + " " + multi + " " + data + "  " + sviluppatore + " " + distributore + " " + immaginePath + " " + pegi);
                    rd = sc.getRequestDispatcher("/error.jsp");
                    rd.forward(request, response);
                }
            } else {
                request.setAttribute("messageError", "Operazione non riuscita!non sei un amministratore");
                rd = sc.getRequestDispatcher("/error.jsp");
                rd.forward(request, response);
            }
        } else {
            request.setAttribute("messageError", "Operazione non riuscita!Non si dispone dei privilegi necessari per accedere alla pagina richiesta");
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }
    }

    /**
     * metodo ausiliario che serve per registrare un testo su un file
     * restituendo il suo path
     *
     * @param request
     * @param response
     * @param type il tipo della categoria (notizia o recensione )a cui si
     * riferisce il testo
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     * @throws NoSuchAlgorithmException se si verifica un errore nell'algoritmo
     * di crittografia
     * @return il path dal file creato
     */
    private String pathTestoInserito(HttpServletRequest request, HttpServletResponse response, String type) throws ServletException, IOException, ParseException {
        session = request.getSession(true);
        session.setMaxInactiveInterval(60 * 60 * 24);
        int index = sc.getRealPath("/").indexOf("\\dist\\");
        appPath = sc.getRealPath("/").substring(0, index) + "\\EnterpriseApplication12-13-war\\web\\";
        DateFormat data = new SimpleDateFormat("yyMMddHHmmssZ");
        String path;
        String miaData = data.format(Calendar.getInstance().getTime());
        if (type.equals("n")) {
            path = appPath + "elencoNotizie\\notizia" + miaData + ".txt";//da vedere  
        } //   path = "..\\..\\elencoNotizie\\notizia"+miaData+".txt";
        else {
            path = appPath + "elencoRecensioni\\recensione" + miaData + ".txt";//da vedere  
        }
        BufferedWriter out =
                new BufferedWriter(new OutputStreamWriter(
                new FileOutputStream(path), Charset.forName("ISO-8859-1")));
        String testo = request.getParameter("testo");
        out.write(testo);
        out.close();
        return path;
    }

    /**
     * metodo per la lettura di un file
     *
     * @param path il path o il percorso dal file
     * @throws IOException se si verifica un errore di I/O
     * @return il testo contenuto del file
     */
    private String readFile(String path) throws IOException {
        String testo = "";
        FileReader f2stream5 = new FileReader(path);
        BufferedReader read = new BufferedReader(f2stream5);
        String s = "";
        for (int i = 1; (s = read.readLine()) != null; i++) {
            testo = testo + new String(s.getBytes(), Charset.forName("UTF-8"));
        }
        read.close();
        return testo;
    }

    /**
     * Metodo ausiliario che porta alla pagina di visualizzazione di notizie per
     * la loro modifica
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneModificaNotiziaAus(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        sc = getServletContext();
        rd = null;
        session = request.getSession(true);
        session.setMaxInactiveInterval(60 * 60 * 24);
        List<Notizia> l = notiziaFacade.findAll();

        session.setAttribute("listNews", l);
        rd = sc.getRequestDispatcher("/listNews.jsp");
        rd.forward(request, response);
    }

    /**
     * Metodo ausiliario che porta alla pagina della modifica della notizia
     * caricando tutte le sue informazioni
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azionePreparaModificaNotizia(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        sc = getServletContext();
        rd = null;
        session = request.getSession(true);
        session.setMaxInactiveInterval(60 * 60 * 24);
        Utente utenteAttuale = (Utente) session.getAttribute("utente");
        if (utenteAttuale != null) {
            long idNotizia = Long.parseLong(request.getParameter("id"));
            Notizia notizia = gestoreNotiziaBean.trova(idNotizia);
            String testo = "";
            if (notizia != null) {
                //if(utenteAttuale.getTipo().equals("r")&&(notizia.getAutore().getId().equals(utenteAttuale.getId()))||(utenteAttuale.getTipo().equals("a"))){
                if (utenteAttuale.getTipo().equals("r") && (notizia.getAutore().getId().equals(utenteAttuale.getId()))) {
                    request.setAttribute("notizia", notizia);
                    testo = readFile(notizia.getTesto());
                    request.setAttribute("testo", testo);
                    request.setAttribute("listPiattaforme", piattaformaFacade.findAll());
                    rd = sc.getRequestDispatcher("/modifyNews.jsp");
                    rd.forward(request, response);
                    // nella modifica non dai possibilita di modificare il titolo e la data
                } else {
                    request.setAttribute("messageError", "Operazione non riuscita!non sei un recensore o non sei il creatore della notizia");
                    rd = sc.getRequestDispatcher("/error.jsp");
                    rd.forward(request, response);
                }
            } else {
                request.setAttribute("messageError", "Operazione non riuscita!notizia non e' trovata");
                rd = sc.getRequestDispatcher("/error.jsp");
                rd.forward(request, response);
            }
        } else {
            request.setAttribute("messageError", "Operazione non riuscita!Non si dispone dei privilegi necessari per accedere alla pagina richiesta");
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }
    }

    /**
     * Modificare i dati di una notizia presente nel DB da parte dal recensore
     * creatore della notizia
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     * @throws ParseException se si verifica un errore in modo imprevisto
     * durante l'analisi o la parsificazione
     */
    private void azioneModificaNotizia(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, ParseException {
        sc = getServletContext();
        rd = null;
        session = request.getSession(true);
        session.setMaxInactiveInterval(60 * 60 * 24);
        // si passa dalla sessione o idNotizia o la coppia titolo,data
        long idNotizia = Long.parseLong(request.getParameter("id"));
        Notizia notizia = gestoreNotiziaBean.trova(idNotizia);
        String titolo = notizia.getTitolo();
        Date data = notizia.getData();
        String testo = request.getParameter("testo");
        //request.setAttribute("pathTesto",notizia.getTesto());        
        pathTestoModificato(notizia.getTesto(), testo);
        List<String> listaPiattaforme = new LinkedList<String>();
        String piattaforma;
        int np = new Integer(request.getParameter("numeroPiatt"));
        for (int i = 1; i <= np; i++) {
            piattaforma = request.getParameter("piattaforma" + i);
            if (piattaforma != null) {
                listaPiattaforme.add(piattaforma);
            }
        }

        String immaginePath = request.getParameter("immaginePath");
        immaginePath = "./img/" + immaginePath;
        List<Piattaforma> l = piattaformaFacade.findAll();
        List<Piattaforma> lista = new LinkedList<Piattaforma>();
        for (Piattaforma p : l) {
            for (String nomeP : listaPiattaforme) {
                if (p.getNome().equals(nomeP)) {
                    lista.add(p);
                }
                //if(p.getNome().equals(piattaforma.toUpperCase())) lista.add(p);
            }
        }
        if (!lista.isEmpty()) {
            Notizia nAggiornata;
            nAggiornata = gestoreNotiziaBean.aggiorna(titolo, notizia.getTesto(), data, lista, immaginePath);
            if (nAggiornata != null) {
                //request.setAttribute("messageError","azione compiuta con successo");
                rd = sc.getRequestDispatcher("/Controller?button=modificaNotiziaAus");
                rd.forward(request, response);
            } else {
                request.setAttribute("messageError", "Operazione non riuscita!aggiornamento della notizia e' fallito");
                rd = sc.getRequestDispatcher("/error.jsp");
                rd.forward(request, response);
            }
        } else {
            request.setAttribute("messageError", "Operazione non riuscita!nome piattaforma non e' presente");
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }


    }

    /**
     * metodo ausiliario che serve per registrare un testo modificato su un file
     * restituendo il suo path
     *
     * @param request
     * @param response
     * @param path il path dal file da modificare
     * @param testo il testo modificato da inserire
     * @throws IOException se si verifica un errore di I/O
     * @return il path dal file modificato
     */
    private String pathTestoModificato(String path, String testo) throws IOException {
        BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(path, false), Charset.forName("ISO-8859-1")));
        out.write(testo);
        out.close();
        return path;
    }

    /**
     * Mostra l'elenco delle notizie
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneMostraElencoNotizie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        session = request.getSession();
        session.setMaxInactiveInterval(60 * 60 * 24);
        String titolo = request.getParameter("titolo");
        String testo = request.getParameter("testo");
        String piattaforma = request.getParameter("piattaforma");
        String data = request.getParameter("data");// data in questa forma yyyy-MM-dd come nel db
        if (titolo == null) {
            titolo = "";
        }
        if (testo == null) {
            testo = "";
        }
        if (piattaforma == null) {
            piattaforma = "";
        }
        if (data == null) {
            data = "";
        }
        List l = gestoreNotiziaBean.mostraElenco(titolo, testo, piattaforma, data);
        session.setAttribute("elencoNotizie", l);
        rd = sc.getRequestDispatcher("/elencoNotizie.jsp");
        rd.forward(request, response);
    }

    /**
     * Metodo ausiliario che porta alla pagina di visualizzazione di notizie per
     * la loro cancellazione
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneCancellaNotiziaAus(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        sc = getServletContext();
        rd = null;
        session = request.getSession(true);
        session.setMaxInactiveInterval(60 * 60 * 24);
        List l = gestoreNotiziaBean.mostraElenco("", "", "", "");
        session.setAttribute("elencoNotizie", l);
        rd = sc.getRequestDispatcher("/removeNews.jsp");
        rd.forward(request, response);
    }

    /**
     * Cancellare i dati di una notizia dal DB da parte da un amministratore
     * oppure il recensore creatore della notizia
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneCancellaNotizia(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        sc = getServletContext();
        rd = null;
        session = request.getSession(true);
        session.setMaxInactiveInterval(60 * 60 * 24);
        Utente utenteAttuale = (Utente) session.getAttribute("utente");
        if (utenteAttuale != null) {
            long idNotizia = Long.parseLong(request.getParameter("id"));
            Notizia notizia = gestoreNotiziaBean.trova(idNotizia);
            if (notizia != null) {
                if (utenteAttuale.getTipo().equals("r") && (notizia.getAutore().getId().equals(utenteAttuale.getId())) || (utenteAttuale.getTipo().equals("a"))) {
                    File f = new File(notizia.getTesto());
                    if (!f.delete()) {
                        request.setAttribute("messageError", "Operazione non riuscita!cancellazione Notizia e' fallita");
                        rd = sc.getRequestDispatcher("/error.jsp");
                        rd.forward(request, response);
                    }
                    if (gestoreNotiziaBean.elimina(notizia)) {
                        rd = sc.getRequestDispatcher("/Controller?button=modificaNotiziaAus");
                        rd.forward(request, response);
                    } else {
                        request.setAttribute("messageError", "Operazione non riuscita!cancellazione Notizia e' fallita");
                        rd = sc.getRequestDispatcher("/error.jsp");
                        rd.forward(request, response);
                    }
                } else {
                    request.setAttribute("messageError", "Operazione non riuscita!non sei un amministratore o non sei il recensore creatore della notizia");
                    rd = sc.getRequestDispatcher("/error.jsp");
                    rd.forward(request, response);
                }
            } else {
                request.setAttribute("messageError", "Operazione non riuscita!notizia non e' trovata");
                rd = sc.getRequestDispatcher("/error.jsp");
                rd.forward(request, response);
            }
        } else {
            request.setAttribute("messageError", "Operazione non riuscita!Non si dispone dei privilegi necessari per accedere alla pagina richiesta");
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }
    }

    /**
     * Visualizza le notizie e le recensione secondo il tipo della piattaforma
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    public void azioneVisualizzaRecNot(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        sc = getServletContext();
        rd = null;
        //  if(request.getParameter("type")){
        String piattaforma = (String) request.getParameter("platform");
        String type = (String) request.getParameter("type");
        List<String> p = new LinkedList<String>();
        if (piattaforma.equals("SONY")) {
            p.add("PS3");
            p.add("PSVITA");
        } else if (piattaforma.equals("NINTENDO")) {
            p.add("WII");
            p.add("WIIU");
            p.add("DS");
            p.add("3DS");

        } else {
            p.add(piattaforma);
        }
        if (type.equals("news") || type.equals("both")) {
            List<Notizia> l;
            if (!piattaforma.equals("all")) {
                l = notiziaFacade.findPlatform(p);
            } else {
                l = notiziaFacade.findAll();
            }
            request.setAttribute("listNotizie", l);
            List<String> testoNotizie = new ArrayList<String>();
            if (l != null) {
                for (Notizia n : l) {
                    testoNotizie.add(readFile(n.getTesto()));
                }
            }
            request.setAttribute("testoNotizie", testoNotizie);
        }
        if (type.equals("reviews") || type.equals("both")) {
            List<RecensioneInterna> r;
            if (!piattaforma.equals("all")) {
                r = gestoreRecensioniBean.search(null, null, p, null);
            } else {
                r = gestoreRecensioniBean.visualizzaRecensioniInterne();
            }
            request.setAttribute("listRecensioni", r);
            List<String> testoRecensioni = new ArrayList<String>();
            if (r != null) {
                for (RecensioneInterna ri : r) {
                    testoRecensioni.add(readFile(ri.getTesto()));
                }
            }
            request.setAttribute("testoRecensioni", testoRecensioni);

        }


        rd = sc.getRequestDispatcher("/platform.jsp");
        rd.forward(request, response);


    }

    /**
     * Metodo ausiliario che porta alla pagina dell'aggiunta articolo nuovo
     * mettendo in sessione la lista dei videogames
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneArticoloNuovo(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {

        try {
            //settata temporaneamente qui come attributo di sessione ma sarebbe più corretto 
            //estrarre questa lista quando vai sulla pagina di aggiunta ArticoloNuovo
            //cioè quando selezioni dal menù dell'Admin Inserisci/Modifica/cancella Articoli nuovi 
            List<Videogame> videogames = gestoreVideogameBean.findVideogame();
            request.setAttribute("listVideogiochi", videogames);
            rd = sc.getRequestDispatcher("/addNewArticle.jsp");
            rd.forward(request, response);

        } catch (Exception e) {
            request.setAttribute("messageError", e);
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }

    }

    /**
     * Metodo che porta alla pagina di visualizzazione articolo usato
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneArticoloUsato(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {

        try {

            List<Utente> utenti = gestoreUtenteBean.mostraElenco("", "", "u", "s");
            List<ArticoloUsato> articoliUsati = gestoreArticoloBean.cercaArticoliUsati();

            session.setAttribute("listaUtenti", utenti);
            session.setAttribute("artUsati", articoliUsati);

            rd = sc.getRequestDispatcher("/provaArticoloUsato.jsp");
            rd.forward(request, response);
        } catch (Exception e) {
            request.setAttribute("messageError", e);
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }

    }

    /**
     * Metodo ausiliario che porta alla pagina dell'aggiunta articolo usato
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneVendiArticolo(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {

        try {
            rd = sc.getRequestDispatcher("/sellArticle.jsp");
            rd.forward(request, response);
        } catch (Exception e) {
            request.setAttribute("messageError", e);
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }

    }

    /**
     * Aggiunge un ArticoloNuovo al DB da parte da un amministratore
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneAggiungiArticoloNuovo(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        try {
            String descrizione = request.getParameter("descrizione");
            String disponibilita = request.getParameter("disponibilita");
            Integer dispInteger = new Integer(disponibilita);
            String nome = request.getParameter("nome");
            String prezzo = request.getParameter("prezzo");
            Integer prezzoInteger = new Integer(prezzo);
            String sconti = request.getParameter("sconti");
            Integer scontiInteger = new Integer(sconti);
            String pathImmagine = request.getParameter("pathImmagine");
            pathImmagine = "./img/" + pathImmagine;
            String idVid = request.getParameter("idVideogame");
            Videogame videogame = null;
            if (idVid != null) {
                videogame = gestoreVideogameBean.findVideogame(new Long(idVid));
            }

            Calendar localCalendar = Calendar.getInstance(TimeZone.getDefault());
            Date data = localCalendar.getTime();

            gestoreArticoloBean.aggiungiArticoloNuovo(nome, descrizione, prezzoInteger, dispInteger, videogame, scontiInteger, data, pathImmagine);
            request.setAttribute("messageError", idVid + "articolo nuovo inserito con successo");
            rd = sc.getRequestDispatcher("/Controller?button=modificaCancellaArtNuovi");
            rd.forward(request, response);
        } catch (Exception e) {
            request.setAttribute("messageError", e.getMessage());
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }
    }

    /**
     * Metodo ausiliario per la modifica di un ArticoloNuovo al DB da parte da
     * un amministratore caricando tutti i dati dal ArticoloNuovo che si sta per
     * modificarlo
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azionePreparaEditArticoloNuovo(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        try {

            Long id = Long.parseLong(request.getParameter("id"));
            ArticoloNuovo a = gestoreArticoloBean.cercaArticoloNuovo(id);

            request.setAttribute("articoloEdit", a);
            rd = sc.getRequestDispatcher("/modifyArticleNew.jsp");
            rd.forward(request, response);
        } catch (Exception e) {
            request.setAttribute("messageError", e);
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }
    }

    /**
     * Modifica di un ArticoloNuovo da parte da un amministratore
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneEditArticoloNuovo(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        try {

            Long id = Long.parseLong(request.getParameter("id"));
            String desc = request.getParameter("descrizione");
            Integer disp = Integer.parseInt(request.getParameter("disponibilita"));
            String nome = request.getParameter("nome");
            Integer prezzo = Integer.parseInt(request.getParameter("prezzo"));
            Integer sconti = Integer.parseInt(request.getParameter("sconti"));
            String idVid = request.getParameter("idVideogame");
            Videogame videogame = null;
            if (!idVid.equals("-1")) {
                videogame = gestoreVideogameBean.findVideogame(new Long(idVid));
            }
            String pathImmagine = request.getParameter("pathImmagine");

            gestoreArticoloBean.modificaArticoloNuovo(id, nome, desc, disp, prezzo, videogame, sconti, pathImmagine);

            rd = sc.getRequestDispatcher("/Controller?button=modificaCancellaArtNuovi");
            rd.forward(request, response);
        } catch (Exception e) {
            request.setAttribute("messageError", e);
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }
    }

    /**
     * Rimozione di un ArticoloNuovo da parte da un amministratore
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneCancellaArticoloNuovo(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        try {

            Long id = Long.parseLong(request.getParameter("id"));
            ArticoloNuovo a = gestoreArticoloBean.cercaArticoloNuovo(id);
            gestoreArticoloBean.eliminaArticoloNuovo(a);

            rd = sc.getRequestDispatcher("/Controller?button=modificaCancellaArtNuovi");
            rd.forward(request, response);
        } catch (Exception e) {
            request.setAttribute("messageError", e);
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }

    }

    /**
     * Visualizza tutti gli ArticoloNuovi presenti nel DB
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneModificaCancellaArtNuovi(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        sc = getServletContext();
        rd = null;
        List<ArticoloNuovo> artNuovi = gestoreArticoloBean.cercaArticoliNuovi();
        session.setAttribute("listArticleNew", artNuovi);
        rd = sc.getRequestDispatcher("/listArticleNew.jsp");
        rd.forward(request, response);
    }

    /**
     * Aggiunge un ArticoloUsato al DB da parte da un utente generico
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneInserisciArticoloUsato(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        try {

            boolean confermaBoolean = false;
            String nome = request.getParameter("nomeArtUsato");
            String descrizione = request.getParameter("descrizioneArtUsato");
            String prezzo = request.getParameter("prezzoArtUsato");
            Integer prezzoInteger = new Integer(prezzo);
            String commento = request.getParameter("commentoArtUsato");
            String pathImmagine = request.getParameter("pathImmagine");
            pathImmagine = "./img/" + pathImmagine;
            confermaBoolean = false;

            Long id = Long.parseLong(request.getParameter("idUtenteArtUsato"));

            Utente u = (Utente) gestoreUtenteBean.trova(id);
            // Videogame videogame = new Videogame();
            Calendar localCalendar = Calendar.getInstance(TimeZone.getDefault());
            Date data = localCalendar.getTime();

            gestoreArticoloBean.aggiungiArticoloUsato(nome, descrizione, prezzoInteger, confermaBoolean, commento, u, data, pathImmagine);

            rd = sc.getRequestDispatcher("/Controller?button=articoloUsato");
            rd.forward(request, response);
        } catch (Exception e) {
            request.setAttribute("messageError", e);
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }

    }

    /**
     * Aggiunge un ArticoloUsato al DB da parte da un utente generico
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneInserisciArticoloUsatoUtente(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        try {

            boolean confermaBoolean = false;
            String nome = request.getParameter("nomeArtUsato");
            String descrizione = request.getParameter("descrizioneArtUsato");
            String prezzo = request.getParameter("prezzoArtUsato");
            Integer prezzoInteger = new Integer(prezzo);
            String commento = request.getParameter("commentoArtUsato");
            String pathImmagine = request.getParameter("pathImmagine");
            pathImmagine = "./img/" + pathImmagine;
            confermaBoolean = false;
            Utente u = (Utente) session.getAttribute("utente");

            Calendar localCalendar = Calendar.getInstance(TimeZone.getDefault());
            Date data = localCalendar.getTime();

            gestoreArticoloBean.aggiungiArticoloUsato(nome, descrizione, prezzoInteger, confermaBoolean, commento, u, data, pathImmagine);

            rd = sc.getRequestDispatcher("/Controller?button=visualizzaArticoli&typeView=All");
            rd.forward(request, response);
        } catch (Exception e) {
            request.setAttribute("messageError", e);
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }

    }

    /**
     * Metodo ausiliario per la modifica di un ArticoloUsato caricando tutti i
     * dati dal ArticoloNuovo che si sta per modificarlo
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azionePreparaEditArticoloUsato(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {

        Long idLong = Long.parseLong(request.getParameter("id"));
        ArticoloUsato artUsato = (ArticoloUsato) gestoreArticoloBean.cercaArticoloUsato(idLong);

        request.setAttribute("artUsato", artUsato);
        rd = sc.getRequestDispatcher("/modifyArticleUsed.jsp");
        rd.forward(request, response);

    }

    /**
     * Modifica di un ArticoloUsato
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneEditaArticoloUsato(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        try {
            boolean conf = false;

            //Controllo chi è l'utente che effettua la modifica dell'articolo
            Long utModificatoreLong = Long.parseLong(request.getParameter("utenteModificatore"));
            Utente utModificatore = (Utente) gestoreUtenteBean.trova(utModificatoreLong);

            //Cerco nel db l'articolo da modificare
            Long id = Long.parseLong(request.getParameter("idArticolo"));
            ArticoloUsato artDaModificare = gestoreArticoloBean.cercaArticoloUsato(id);
            String desc = request.getParameter("descrizione");
            String nome = request.getParameter("nome");
            String commento = request.getParameter("commento");
            Integer prezzo = Integer.parseInt(request.getParameter("prezzo"));
            String pathImmagine = request.getParameter("pathImmagine");
            pathImmagine = "./img/" + pathImmagine;
            Long utenteLong = Long.parseLong(request.getParameter("utenteArtUsato"));
            Utente utProprietario = gestoreUtenteBean.trova(utenteLong);

            //Gestisco il parametro confermato a seconda se sono amministratore o meno
            if (utModificatore.getTipo().equals("a")) {
                List<ArticoloUsato> usatiDaConfermare = (List<ArticoloUsato>) session.getAttribute("usatiDaConfermare");

                String confermato = request.getParameter("confermato");
                if (confermato.equalsIgnoreCase("true")) {
                    conf = true;
                } else {
                    conf = false;
                }
                //Se la modifica dell'articolo ha interessato anche la conferma allora rimuovilo dagli articoli da confermare
                //Viceversa se la modifica avviene al contrario, cioè la conferma viene messa a false allora reinseriscilo negli articolo da confermare 
                if (confermato.equalsIgnoreCase("true") && !artDaModificare.isConfermato()) {
                    usatiDaConfermare.remove(artDaModificare);
                    session.setAttribute("usatiDaConfermare", usatiDaConfermare);
                } else if (confermato.equalsIgnoreCase("false") && artDaModificare.isConfermato()) {
                    usatiDaConfermare.add(artDaModificare);
                    session.setAttribute("usatiDaConfermare", usatiDaConfermare);
                }
            }
            // Se sto modificando l'articolo in quanto proprietario dello stesso allora non avrò il parametro per confermarlo
            // quindi lo lascio invariato
            if (utModificatore.getTipo().equals("u") && utModificatore.getUsername().equals(utProprietario.getUsername())) {
                conf = artDaModificare.isConfermato();
            }

            gestoreArticoloBean.modificaArticoloUsato(id, nome, desc, prezzo, conf, commento, pathImmagine, utProprietario);

            if (utModificatore.getTipo().equals("u")) {
                rd = sc.getRequestDispatcher("/Controller?button=visualizzaArticoli&typeView=Mine");
            } else if (utModificatore.getTipo().equals("a")) {
                rd = sc.getRequestDispatcher("/Controller?button=modificaCancellaArtUsati&confirm=n");
            }
            rd.forward(request, response);
        } catch (Exception e) {
            request.setAttribute("messageError", e);
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }
    }

    /**
     * Conferma da parte di un amministratore per l'inserimento di un
     * ArticoloUsato nel DB
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneConfermaArticoloUsato(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        try {

            //Cerco nel db l'articolo da confermare
            Long id = Long.parseLong(request.getParameter("id"));
            ArticoloUsato artDaModificare = gestoreArticoloBean.cercaArticoloUsato(id);

            //Gestisco il parametro confermato a seconda se sono amministratore o meno
            List<ArticoloUsato> usatiDaConfermare = (List<ArticoloUsato>) session.getAttribute("usatiDaConfermare");

            usatiDaConfermare.remove(artDaModificare);
            session.setAttribute("usatiDaConfermare", usatiDaConfermare);
            gestoreArticoloBean.modificaArticoloUsato(id, artDaModificare.getNome(), artDaModificare.getDescrizioneGenerale(), artDaModificare.getPrezzo(), true, artDaModificare.getCommento(), artDaModificare.getPathImmagine(), artDaModificare.getUtente());

            rd = sc.getRequestDispatcher("/Controller?button=modificaCancellaArtUsati&confirm=n");
            rd.forward(request, response);
        } catch (Exception e) {
            request.setAttribute("messageError", e);
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }
    }

    /**
     * Rimozione di un ArticoloUsato da parte da un amministratore
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneCancellaArticoloUsato(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {

        Long idArticleLong = Long.parseLong(request.getParameter("id"));
        Long idUserLong = Long.parseLong(request.getParameter("idUser"));
        ArticoloUsato a = (ArticoloUsato) gestoreArticoloBean.cercaArticoloUsato(idArticleLong);
        Utente utCancellatore = gestoreUtenteBean.trova(idUserLong);

        gestoreArticoloBean.eliminaArticoloUsato(a);

        if (utCancellatore.getTipo().equals("u")) {
            rd = sc.getRequestDispatcher("/Controller?button=visualizzaArticoli&typeView=Mine");
        } else if (utCancellatore.getTipo().equals("a")) {
            rd = sc.getRequestDispatcher("/Controller?button=modificaCancellaArtUsati&confirm=n");
        }
        rd.forward(request, response);
    }

    /**
     * Visualizza gli articoli secondo il tipo richiesto e i cui nomi matcha con
     * la stringha di ricerca
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneRicercaArticolo(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        try {
            List<ArticoloNuovo> nuovi = null;
            List<ArticoloUsato> usati = null;
            String keyword = request.getParameter("keywordRicerca");
            String tipiArticoli = request.getParameter("tipiArticoli");

            if (tipiArticoli.equals("n")) {

                nuovi = gestoreArticoloBean.cercaArticoliNuovi(keyword);
                if (!nuovi.isEmpty()) {
                    request.setAttribute("artNuovi", nuovi);
                    request.setAttribute("tipiArticoli", "nuovi");
                }

            } else if (tipiArticoli.equals("u")) {
                usati = gestoreArticoloBean.cercaArticoliUsati(keyword);
                if (!usati.isEmpty()) {
                    request.setAttribute("artUsati", usati);
                    request.setAttribute("tipiArticoli", "usati");
                }

            } else if (tipiArticoli.equals("both")) {
                nuovi = gestoreArticoloBean.cercaArticoliNuovi(keyword);
                usati = gestoreArticoloBean.cercaArticoliUsati(keyword);
                request.setAttribute("tipiArticoli", "both");

                if (!nuovi.isEmpty()) {
                    request.setAttribute("artNuovi", nuovi);
                }
                if (!usati.isEmpty()) {
                    request.setAttribute("artUsati", usati);
                }
                if (nuovi.isEmpty() && usati.isEmpty()) {
                    request.setAttribute("tipiArticoli", "nessuno");
                }
            }

            rd = sc.getRequestDispatcher("/guardaArticoli.jsp");
            rd.forward(request, response);
        } catch (Exception e) {
            request.setAttribute("messageError", e);
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);

        }

    }

    /**
     * Visualizza gli articoli secondo il tipo richiesto cioe' tutti gli
     * articoli o solo articoli usati o articoli nuovi o articoli usati del
     * richiedente o articoli usati di un specifico utente
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneVisualizzaArticoli(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        try {
            Utente ut = (Utente) session.getAttribute("utente");
            System.out.println("Utente attuale = " + ut.getNome());
            List<ArticoloNuovo> nuovi;
            List<ArticoloUsato> usati;
            ArticoloNuovo an;
            ArticoloUsato au;

            String typeView = request.getParameter("typeView");

            if (typeView.equals("All")) {
                nuovi = gestoreArticoloBean.cercaArticoliNuovi();
                usati = gestoreArticoloBean.cercaArticoliUsati();
                request.setAttribute("tipiArticoli", "both");
                request.setAttribute("artNuovi", nuovi);
                request.setAttribute("artUsati", usati);
                rd = sc.getRequestDispatcher("/guardaArticoli.jsp");
                rd.forward(request, response);

            }

            if (typeView.equals("Mine")) {
                usati = gestoreArticoloBean.cercaArticoliUsati(ut);
                request.setAttribute("tipiArticoli", "usati");

                request.setAttribute("artUsati", usati);
                rd = sc.getRequestDispatcher("/guardaArticoli.jsp");
                rd.forward(request, response);
            }

            if (typeView.equals("One")) {
                Long artCode = Long.parseLong(request.getParameter("artCode"));
                String typeArt = request.getParameter("typeArt");
                if (typeArt.equals("nuovo")) {

                    an = gestoreArticoloBean.cercaArticoloNuovo(artCode);
                    request.setAttribute("selezionato", "n");
                    request.setAttribute("artNuovoSelezionato", an);
                }
                if (typeArt.equals("usato")) {

                    au = gestoreArticoloBean.cercaArticoloUsato(artCode);
                    request.setAttribute("selezionato", "u");
                    request.setAttribute("artUsatoSelezionato", au);
                }

                rd = sc.getRequestDispatcher("/guardaArticolo.jsp");
                rd.forward(request, response);
            }

            if (typeView.equals("specificUser")) {
                Long idOwnerLong = Long.parseLong(request.getParameter("idUserOwner"));
                Utente utOwner = gestoreUtenteBean.trova(idOwnerLong);
                usati = gestoreArticoloBean.cercaArticoliUsati(utOwner);
                request.setAttribute("tipiArticoli", "usati");
                request.setAttribute("artUsati", usati);
                rd = sc.getRequestDispatcher("/guardaArticoli.jsp");
                rd.forward(request, response);
            }


        } catch (Exception e) {
            request.setAttribute("messageError", e);
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }
    }

    /**
     * Aggiunge un articolo nuovo al carrello dell'utente
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneAddCarrello(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        try {
            LinkedList<ArticoloNuovo> carrello = (LinkedList<ArticoloNuovo>) session.getAttribute("carrello");
            Long id = Long.parseLong(request.getParameter("idArticolo"));
            ArticoloNuovo artNuovo = gestoreArticoloBean.cercaArticoloNuovo(id);
            if (!carrello.contains(artNuovo)) {
                carrello.add(artNuovo);
            }
            System.out.println("Carrello attuale: " + carrello.toString());

            rd = sc.getRequestDispatcher("/Controller?button=visualizzaArticoli&typeView=All");
            rd.forward(request, response);
        } catch (Exception e) {
            request.setAttribute("messageError", e);
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }
    }

    /**
     * Rimuove un articolo nuovo dal carrello dell'utente
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneRemoveCarrello(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        try {

            LinkedList<ArticoloNuovo> carrello = (LinkedList<ArticoloNuovo>) session.getAttribute("carrello");
            Long id = Long.parseLong(request.getParameter("idArticolo"));
            ArticoloNuovo artNuovo = gestoreArticoloBean.cercaArticoloNuovo(id);
            if (carrello.contains(artNuovo)) {
                carrello.remove(artNuovo);
            }
            System.out.println("Carrello attuale: " + carrello.toString());

            rd = sc.getRequestDispatcher("/Controller?button=visualizzaArticoli&typeView=All");
            rd.forward(request, response);
        } catch (Exception e) {
            request.setAttribute("messageError", e);
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }
    }

    /**
     * Visualizza i messaggi ricevuti ad un utente
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneVisualizzaMailboxRicevuti(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        try {
            session = request.getSession(true);
            session.setMaxInactiveInterval(60 * 60 * 24);
            Utente utenteAttuale = (Utente) session.getAttribute("utente");
            List<Messaggio> mailboxRicevuti = (List<Messaggio>) gestoreMessaggioBean.estraiMessaggiRicevuti(utenteAttuale);
            request.setAttribute("mailboxRicevuti", mailboxRicevuti);
            rd = sc.getRequestDispatcher("/mailboxRicevuti.jsp");
            rd.forward(request, response);
        } catch (Exception e) {
            request.setAttribute("messageError", e);
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }
    }

    /**
     * Visualizza i messaggi inviati da un utente
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneVisualizzaMailboxInviati(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        try {
            session = request.getSession(true);
            session.setMaxInactiveInterval(60 * 60 * 24);
            Utente utenteAttuale = (Utente) session.getAttribute("utente");
            List<Messaggio> mailboxInviati = (List<Messaggio>) gestoreMessaggioBean.estraiMessaggiInviati(utenteAttuale);
            request.setAttribute("mailboxInviati", mailboxInviati);
            rd = sc.getRequestDispatcher("/mailboxInviati.jsp");
            rd.forward(request, response);
        } catch (Exception e) {
            request.setAttribute("messageError", e);
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }
    }

    /**
     * metodo che porta alla pagina di scrittura del messaggio con la lista
     * degli utenti ai quali si pou' inviare il messaggio
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneScriviMessaggio(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        try {
            List<Utente> allDestinatari = gestoreUtenteBean.mostraElenco("", "", "", "s");
            request.setAttribute("allDestinatari", allDestinatari);
            request.setAttribute("destRispostaImpostati", "n");
            rd = sc.getRequestDispatcher("/editorMessaggio.jsp");
            rd.forward(request, response);
        } catch (Exception e) {
            request.setAttribute("messageError", e);
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }
    }

    /**
     * Aggiunge il messaggio alla lista dei destinatari
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneInviaMessaggio(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        try {
            List<Messaggio> messDaLeggere = (List<Messaggio>) session.getAttribute("messDaleggere");
            List<Messaggio> mailboxRicevuti = (List<Messaggio>) session.getAttribute("mailboxRicevuti");
            String[] destSelezionati;
            Utente destinatario;
            List<Utente> destRispostaList = new LinkedList<Utente>();
            session = request.getSession(true);
            Utente mittente = (Utente) session.getAttribute("utente");
            String contenuto = request.getParameter("contenutoMessaggio");
            destSelezionati = request.getParameterValues("destinatariSelezionati");
            for (String d : destSelezionati) {
                destinatario = gestoreUtenteBean.trova(Long.parseLong(d));
                destRispostaList.add(destinatario);
            }
            Messaggio mess = gestoreMessaggioBean.sendMessaggio(contenuto, mittente, destRispostaList);
            //Se invio un messaggio a me stesso dovrò aggiornare la mia mailbox dei messaggi da leggere e la mailbox generale
            if (destRispostaList.contains(mittente)) {
                mailboxRicevuti.add(mess);
                messDaLeggere.add(mess);
            }

            rd = sc.getRequestDispatcher("/Controller?button=visualizzaMailboxRicevuti");
            rd.forward(request, response);
        } catch (Exception e) {
            request.setAttribute("messageError", e);
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }
    }

    /**
     * visualizza il messaggio selezionato
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneVisualizzaMessaggio(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        try {
            List<Messaggio> messDaLeggere = (List<Messaggio>) session.getAttribute("messDaleggere");
            Long messageCode = Long.parseLong(request.getParameter("messageCode"));
            Messaggio m = gestoreMessaggioBean.trovaMessaggio(messageCode);
            if (!gestoreMessaggioBean.messaggioGiaLetto(messageCode)) {
                gestoreMessaggioBean.leggiMessaggio(messageCode);
                messDaLeggere.remove(m);
            }
            request.setAttribute("messaggioDaVisualizzare", m);
            rd = sc.getRequestDispatcher("/visualizzaMessaggio.jsp");
            rd.forward(request, response);
        } catch (Exception e) {
            request.setAttribute("messageError", e);
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }
    }

    /**
     * metodo che porta alla pagina di risposta per il messaggio con la lista
     * degli utenti ai quali si pou' inviare il messaggio
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneRispondiMessaggio(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        try {
            //decodifica la lista dei destinatari
            String[] destRisposta;
            Utente destinatario = null;
            List<Utente> destRispostaList = new LinkedList<Utente>();
            String contatta = request.getParameter("contatta");
            if (contatta.equals("n")) {
                destRisposta = request.getParameterValues("destRisposta");
                for (String d : destRisposta) {
                    destinatario = gestoreUtenteBean.trova(Long.parseLong(d));
                    destRispostaList.add(destinatario);
                }
            } else if (contatta.equals("s")) {
                Long idDest = Long.parseLong(request.getParameter("destRispostaUnico"));
                destinatario = gestoreUtenteBean.trova(idDest);
                destRispostaList.add(destinatario);
            }
            request.setAttribute("destRispostaImpostati", "s");
            request.setAttribute("allDestinatari", destRispostaList);
            rd = sc.getRequestDispatcher("/editorMessaggio.jsp");
            rd.forward(request, response);
        } catch (Exception e) {
            request.setAttribute("messageError", e);
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }
    }

    /**
     * Rimuove il messaggio selezionato
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneRimuoviMessaggio(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        try {
            String idM = (String) request.getParameter("messageCodeToRemove");
            Long idMessaggio = Long.parseLong(idM);
            Messaggio mess = gestoreMessaggioBean.trovaMessaggio(idMessaggio);
            gestoreMessaggioBean.rimuoviMessaggio(idMessaggio);
            List<Messaggio> mailboxRicevuti = (List<Messaggio>) session.getAttribute("mailboxRicevuti");
            //Se invio un messaggio a me stesso dovrò aggiornare la mia mailbox dei messaggi da leggere e la mailbox generale
            mailboxRicevuti.remove(mess);
            rd = sc.getRequestDispatcher("/Controller?button=visualizzaMailboxRicevuti");
            rd.forward(request, response);
        } catch (Exception e) {
            request.setAttribute("messageError", e);
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }
    }

    /**
     * Rimuove un Videogame dal DB da parte di un amministratore
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneRimuoviVideogioco(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        sc = getServletContext();
        rd = null;
        session = request.getSession(true);
        session.setMaxInactiveInterval(60 * 60 * 24);
        Utente utenteAttuale = (Utente) session.getAttribute("utente");
        if (utenteAttuale != null) {
            if (utenteAttuale.getTipo().equals("a")) {
                List<Videogame> videogiochi = (List<Videogame>) session.getAttribute("listVideogiochi");
                session.removeAttribute("listVideogiochi");
                boolean trovato = false;
                String id = request.getParameter("id");
                Long idVideogameLong = Long.parseLong(id);
                Videogame v = gestoreVideogameBean.findVideogame(idVideogameLong);

                /*Iterator<Videogame> i =videogiochi.iterator();
                 while(i.hasNext() && !trovato) {     
                 v=i.next();
                 if(v.getId().toString().equals(id)){
                 trovato=true;
                 }
                 else v=null;
                        
                 }*/
                if (videogiochi.contains(v)) {
                    if (gestoreVideogameBean.eliminaVideogame(v)) {
                        rd = sc.getRequestDispatcher("/Controller?button=visualizzaModificaCancellaVideogioco");
                        rd.forward(request, response);
                    } else {
                        request.setAttribute("messageError", "Operazione non riuscita!cancellazione Videogioco e' fallita");
                        rd = sc.getRequestDispatcher("/error.jsp");
                        rd.forward(request, response);
                    }
                }
            } else {
                request.setAttribute("messageError", "Operazione non riuscita!non sei un amministratore");
                rd = sc.getRequestDispatcher("/error.jsp");
                rd.forward(request, response);
            }
        } else {
            request.setAttribute("messageError", "Operazione non riuscita!Non si dispone dei privilegi necessari per accedere alla pagina richiesta");
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }
    }

    /**
     * Aggiunge una RecensioneInterna al DB da parte di un recensore
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneAggiungiRecensioneInterna(HttpServletRequest request, HttpServletResponse response) throws ParseException, IOException, ServletException {
        sc = getServletContext();
        rd = null;
        session = request.getSession(true);
        session.setMaxInactiveInterval(60 * 60 * 24);
        Utente utenteAttuale = (Utente) session.getAttribute("utente");
        if (utenteAttuale != null) {
            if (utenteAttuale.getTipo().equals("r")) {
                //estraggo il titolo
                String titolo = request.getParameter("titolo");                
                titolo=new String(titolo.getBytes(Charset.forName("ISO-8859-1")),Charset.forName("UTF-8"));
                String testo = pathTestoInserito(request, response, "r");    
                List<String> immaginiPath = new ArrayList<String>();
                //estraggo la data
                GregorianCalendar gc = new GregorianCalendar();
                SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");//e non mm minuscule che rappresentano minuti
                Date data = dateFormat.parse(dateFormat.format(gc.getTime()));                
                List<String> pro = new ArrayList<String>();
                List<String> contro = new ArrayList<String>();
                //estraggo la lista di videogiochi selezionati
                String[] vg = request.getParameterValues("videogiochi");// era meglio dichiarare solo un string al posto dell'array
                String[] videogame = new String[vg.length];
                List<Videogame> videogames = null;
                List<Videogame> resp = new ArrayList<Videogame>();
                //spezzo la stringa in videogioco piattaforma
                for (int i = 0; i < vg.length; i++) {
                    int index = vg[i].indexOf("(");
                    videogame[i] = vg[i].substring(0, index - 1);
                }
                //cerco il videogioco nel db

                List<String> scelti = Arrays.asList(vg);
                videogames = gestoreVideogameBean.findVideogame(videogame[0]);
                for (Videogame v : videogames) {
                    if (scelti.contains(v.getNomeEPiattaforma())) {
                        resp.add(v);
                    }

                }
                //estraggo i contro
                String c="";
                int numeroContro = Integer.parseInt(request.getParameter("numeroContro"));
                for (int i = 0; i < numeroContro; i++) {
                    String s = "contro" + (i + 1);
                    c=request.getParameter(s);
                    c=new String(c.getBytes(Charset.forName("ISO-8859-1")),Charset.forName("UTF-8"));
                    contro.add(c);
                }
                //estraggo i pro
                int numeroPro = Integer.parseInt(request.getParameter("numeroPro"));
                for (int i = 0; i < numeroPro; i++) {
                    String s = "pro" + (i + 1);
                    c=request.getParameter(s);
                    c=new String(c.getBytes(Charset.forName("ISO-8859-1")),Charset.forName("UTF-8"));
                    pro.add(c);
                }
                //estraggo il path delle immagini
                int numeroImm = Integer.parseInt(request.getParameter("numeroImm"));
                for (int i = 0; i < numeroImm; i++) {
                    String s = "immaginePath" + (i + 1);
                    immaginiPath.add("./img/" + request.getParameter(s));
                }
                RecensioneInterna newRecensione = gestoreRecensioniBean.aggiungiRecensioneInterna(titolo, pro, contro, data, utenteAttuale, resp, testo, immaginiPath);
                if (newRecensione != null) {
                    session.setAttribute("videogamesForVoti", resp);//riga aggiunta da Giuseppe
                    rd = sc.getRequestDispatcher("/Controller?button=aggiungiVotoAus");
                    rd = sc.getRequestDispatcher("/addVotesReview.jsp");

                    rd.forward(request, response);
                } else {
                    File f = new File(testo);
                    f.delete();
                    request.setAttribute("messageError", "Operazione non riuscita!inserimento recensione fallito");
                    //azioneHome(request,response);
                    rd = sc.getRequestDispatcher("/error.jsp");
                    rd.forward(request, response);
                }
            }

        } else {
            request.setAttribute("messageError", "Operazione non riuscita!non sei un recensore");
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }
    }

    /**
     * Aggiunge una RecensioneEsterna al DB da parte di un recensore
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneAggiungiRecensioneEsterna(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, ParseException {
        try {
            sc = getServletContext();
            rd = null;
            session = request.getSession(true);
            session.setMaxInactiveInterval(60 * 60 * 24);
            Utente utenteAttuale = (Utente) session.getAttribute("utente");
            if (utenteAttuale != null) {
                if (utenteAttuale.getTipo().equals("r")) {

                    //estraggo il titolo
                    String url = request.getParameter("url");

                    int scala = Integer.parseInt(request.getParameter("scala"));

                    double valutazione = Double.parseDouble(request.getParameter("voto"));

                    //estraggo la lista di videogiochi selezionati
                    String[] vg = request.getParameterValues("videogiochi");

                    String[] videogame = new String[vg.length];

                    List<Videogame> videogames;
                    List<Videogame> resp = new ArrayList<Videogame>();
                    //spezzo la stringa in videogioco piattaforma
                    for (int i = 0; i < vg.length; i++) {
                        int index = vg[i].indexOf("(");
                        videogame[i] = vg[i].substring(0, index - 1);
                    }
                    //cerco il videogioco nel db

                    List<String> scelti = Arrays.asList(vg);

                    videogames = gestoreVideogameBean.findVideogame(videogame[0]);

                    for (Videogame v : videogames) {
                        String s = v.getNomeEPiattaforma();
                        if (scelti.contains(v.getNomeEPiattaforma())) {
                            resp.add(v);
                        }
                    }

                    RecensioneEsterna newRecensione = gestoreRecensioniBean.aggiungiRecensioneEsterna(resp, scala, valutazione, url, utenteAttuale);

                    if (newRecensione != null) {
                        rd = sc.getRequestDispatcher("/Controller?button=modificaRecensioneEsternaAus");
                        rd.forward(request, response);
                    } else {
                        request.setAttribute("messageError", "Operazione non riuscita!inserimento recensione fallito");
                        azioneHome(request,response);
                    }
                }

            } else {
                request.setAttribute("messageError", "Operazione non riuscita!non sei un recensore");
                rd = sc.getRequestDispatcher("/error.jsp");
                rd.forward(request, response);
            }
        } catch (Exception e) {
            System.out.println("Eccezione in aggiungirecensioneesterna");
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP
     * <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP
     * <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

    /**
     * Visualizza il Videogame selezionato
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneVisualizzaVideogioco(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, ParseException {
        sc = getServletContext();
        rd = null;
        //  List<Videogame> videogiochi=(List<Videogame>)session.getAttribute("listVideogiochi");
        // session.removeAttribute("listVideogiochi");
        List<Videogame> videogiochi = (List<Videogame>) session.getAttribute("listVideogiochi");
        if (videogiochi == null) {
            videogiochi = gestoreVideogameBean.findVideogame();
            session.setAttribute("listVideogiochi", videogiochi);
        }
        Videogame v = null;
        boolean trovato = false;
        String id = request.getParameter("id");
        Iterator<Videogame> i = videogiochi.iterator();
        while (i.hasNext() && !trovato) {
            v = i.next();
            if (v.getId().toString().equals(id)) {
                trovato = true;
            } else {
                v = null;
            }

        }
        if (v != null) {
            request.setAttribute("videogame", v);
        }
        rd = sc.getRequestDispatcher("/visualizeVideogame.jsp");
        rd.forward(request, response);
    }
    /* Metodo ausiliario per l'aggiunta di un slashe ad una stringha*/

    public static String addSlashes(String str) {
        if (str == null) {
            return "";
        }

        StringBuffer s = new StringBuffer((String) str);
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == '\'') {
                s.insert(i++, '\\');
            }
        }
        return s.toString();

    }

    /**
     * Cerca le notizie e le recensioni che i loro testi contengono la parola di
     * ricerca
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneCerca(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        sc = getServletContext();
        rd = null;
        String text = request.getParameter("cerca");
        try {

            List<Notizia> l = gestoreNotiziaBean.mostraElenco(null, text, null, null);
            request.setAttribute("listNotizie", l);
            List<String> testoNotizie = new ArrayList<String>();
            for (Notizia n : l) {
                testoNotizie.add(readFile(n.getTesto()));
            }
            request.setAttribute("testoNotizie", testoNotizie);
            List<RecensioneInterna> r = gestoreRecensioniBean.search(null, text, null, null);
            request.setAttribute("listRecensioni", r);
            List<String> testoRecensioni = new ArrayList<String>();
            for (RecensioneInterna ri : r) {
                testoRecensioni.add(readFile(ri.getTesto()));
            }
            request.setAttribute("testoRecensioni", testoRecensioni);

            rd = sc.getRequestDispatcher("/platform.jsp");
            rd.forward(request, response);
        } catch (FileNotFoundException ex) {
            request.setAttribute("messageError", "File Not Found");
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }
    }

    /**
     * Metodo ausiliario che porta alla pagina di modifica RecensioneInterna
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneModificaRecensioneInternaAus(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        sc = getServletContext();
        rd = null;
        session = request.getSession(true);
        session.setMaxInactiveInterval(60 * 60 * 24);
        List<RecensioneInterna> recensioniInterne = gestoreRecensioniBean.visualizzaRecensioniInterne();
        request.setAttribute("recensioniInterne", recensioniInterne);
        rd = sc.getRequestDispatcher("/listRecensioniInterne.jsp");
        rd.forward(request, response);
    }

    /**
     * Metodo ausiliario per la modifica di una recensione interna caricando
     * tutti i dati dal ArticoloNuovo che si sta per modificarlo
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azionePreparaModificaRecInterna(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        sc = getServletContext();
        rd = null;
        session = request.getSession(true);
        session.setMaxInactiveInterval(60 * 60 * 24);
        Utente utenteAttuale = (Utente) session.getAttribute("utente");
        //System.out.println("Dentro prepara modifica rec interna");
        if (utenteAttuale != null) {
            long idRecensione = Long.parseLong(request.getParameter("id"));
            RecensioneInterna recensione = gestoreRecensioniBean.trova(idRecensione);
            String testo;
            //System.out.println("Dentro prepara modifica rec interna");
            if (recensione != null) {
                //if(utenteAttuale.getTipo().equals("r")&&(notizia.getAutore().getId().equals(utenteAttuale.getId()))||(utenteAttuale.getTipo().equals("a"))){
                if (utenteAttuale.getTipo().equals("r") && (recensione.getAutore().getId().equals(utenteAttuale.getId())) || utenteAttuale.getTipo().equals("a")) {
                    request.setAttribute("recensione", recensione);
                    testo = readFile(recensione.getTesto());
                    request.setAttribute("testo", testo);
                    request.setAttribute("listPiattaforme", piattaformaFacade.findAll());
                    //System.out.println("Dentro prepara modifica rec interna");
                    rd = sc.getRequestDispatcher("/modifyRec.jsp");
                    rd.forward(request, response);
                    // nella modifica non dai possibilita di modificare il titolo e la data
                } else {
                    request.setAttribute("messageError", "Operazione non riuscita!non sei un recensore o non sei il creatore della notizia");
                    rd = sc.getRequestDispatcher("/error.jsp");
                    rd.forward(request, response);
                }
            } else {
                request.setAttribute("messageError", "Operazione non riuscita!notizia non e' trovata");
                rd = sc.getRequestDispatcher("/error.jsp");
                rd.forward(request, response);
            }
        } else {
            request.setAttribute("messageError", "Operazione non riuscita!Non si dispone dei privilegi necessari per accedere alla pagina richiesta");
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }
    }

    /**
     * Cancella una recensione dal DB da parte dal recensore creatore della
     * recensione o da parte di un amministratore caricando tutti i dati dal
     * ArticoloNuovo che si sta per modificarlo
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneCancellaRecensione(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        sc = getServletContext();
        rd = null;
        session = request.getSession(true);
        session.setMaxInactiveInterval(60 * 60 * 24);
        Utente utenteAttuale = (Utente) session.getAttribute("utente");
        if (utenteAttuale != null) {
            long idRecensione = Long.parseLong(request.getParameter("id"));
            RecensioneInterna recensione = gestoreRecensioniBean.trova(idRecensione);
            if (recensione != null) {
                if (utenteAttuale.getTipo().equals("r") && (recensione.getAutore().getId().equals(utenteAttuale.getId())) || (utenteAttuale.getTipo().equals("a"))) {
                    if (gestoreRecensioniBean.eliminaRecensioneInterna(recensione)) {
                        request.setAttribute("messageError", "azione compiuta con successo");
                        rd = sc.getRequestDispatcher("/success.jsp");
                        rd.forward(request, response);
                    } else {
                        request.setAttribute("messageError", "Operazione non riuscita!cancellazione Recensione e' fallita");
                        rd = sc.getRequestDispatcher("/error.jsp");
                        rd.forward(request, response);
                    }
                } else {
                    request.setAttribute("messageError", "Operazione non riuscita!non sei un amministratore o non sei il recensore creatore della notizia");
                    rd = sc.getRequestDispatcher("/error.jsp");
                    rd.forward(request, response);
                }
            } else {
                request.setAttribute("messageError", "Operazione non riuscita!recensione non e' trovata");
                rd = sc.getRequestDispatcher("/error.jsp");
                rd.forward(request, response);
            }
        } else {
            request.setAttribute("messageError", "Operazione non riuscita!Non si dispone dei privilegi necessari per accedere alla pagina richiesta");
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }
    }

    /**
     * Modifica di una recensione interna da parte dal recensore creatore della
     * recensione o da parte di un amministratore caricando tutti i dati dal
     * ArticoloNuovo che si sta per modificarlo
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneModificaRecensioneInterna(HttpServletRequest request, HttpServletResponse response) throws IOException, ParseException, ServletException {
        sc = getServletContext();
        rd = null;
        session = request.getSession(true);
        session.setMaxInactiveInterval(60 * 60 * 24);
        Utente utenteAttuale = (Utente) session.getAttribute("utente");
        if (utenteAttuale != null) {
            if (utenteAttuale.getTipo().equals("r") || utenteAttuale.getTipo().equals("a")) {
                //estraggo il titolo
                String titolo = request.getParameter("titolo");
                titolo=new String(titolo.getBytes(Charset.forName("ISO-8859-1")),Charset.forName("UTF-8"));
                RecensioneInterna ri = gestoreRecensioniBean.getRecensioneInterna(titolo);
                System.out.println("prima di testo ");
                String testo = pathTestoModificato(ri.getTesto(), request.getParameter("testo"));
                System.out.println("dopo di testo");
                List<String> immaginiPath = new ArrayList<String>();
                //estraggo la data


                List<String> pro = new ArrayList<String>();
                List<String> contro = new ArrayList<String>();


                String c="";
                int numeroContro = Integer.parseInt(request.getParameter("numeroContro"));
                for (int i = 0; i < numeroContro; i++) {
                    String s = "contro" + (i + 1);
                    c=request.getParameter(s);
                    c=new String(c.getBytes(Charset.forName("ISO-8859-1")),Charset.forName("UTF-8"));
                    contro.add(c);
                }
                //estraggo i pro
                int numeroPro = Integer.parseInt(request.getParameter("numeroPro"));
                for (int i = 0; i < numeroPro; i++) {
                    String s = "pro" + (i + 1);
                    c=request.getParameter(s);
                    c=new String(c.getBytes(Charset.forName("ISO-8859-1")),Charset.forName("UTF-8"));
                    pro.add(c);
                }
                //estraggo il path delle immagini
                int numeroImm = Integer.parseInt(request.getParameter("numeroImm"));
                for (int i = 0; i < numeroImm; i++) {
                    String s = "immaginePath" + (i + 1);
                    immaginiPath.add("./img/" + request.getParameter(s));
                }
                System.out.println("sono prima della modifica recensione interna");
                RecensioneInterna newRecensione = gestoreRecensioniBean.modificaRecensioneInterna(titolo, pro, contro, testo, immaginiPath);

                if (newRecensione != null) {
                    rd = sc.getRequestDispatcher("/Controller?button=visualizzaRecensioniInterne");
                    rd.forward(request, response);
                } else {
                    request.setAttribute("messageError", "Operazione non riuscita!inserimento recensione fallito");
                    azioneHome(request,response);
                }
            }

        } else {
            request.setAttribute("messageError", "Operazione non riuscita!non sei un recensore");
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }
    }

    /**
     * Metodo ausiliario che porta alla pagina dell'aggiunta di una
     * RecensioneEsterna
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneAggiungiRecensioneEsternaAus(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        sc = getServletContext();
        rd = null;
        List<Piattaforma> l = piattaformaFacade.findAll();
        List<Videogame> videogiochi = gestoreVideogameBean.findVideogame();
        request.setAttribute("listPiattaforme", l);
        request.setAttribute("listVideogiochi", videogiochi);
        rd = sc.getRequestDispatcher("/addExternalReview.jsp");
        rd.forward(request, response);
    }

    /**
     * Cancella una recensione interna dal DB da parte dal recensore creatore
     * della recensione o da parte di un amministratore caricando tutti i dati
     * dal ArticoloNuovo che si sta per modificarlo
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneCancellaRecensioneInterna(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        sc = getServletContext();
        rd = null;
        session = request.getSession(true);
        session.setMaxInactiveInterval(60 * 60 * 24);
        Utente utenteAttuale = (Utente) session.getAttribute("utente");
        if (utenteAttuale != null) {
            long idRecensione = Long.parseLong(request.getParameter("id"));
            RecensioneInterna recensione = gestoreRecensioniBean.trova(idRecensione);
            if (recensione != null) {
                if (utenteAttuale.getTipo().equals("r") && (recensione.getAutore().getId().equals(utenteAttuale.getId())) || (utenteAttuale.getTipo().equals("a"))) {
                    File f = new File(recensione.getTesto());
                    if (!f.delete()) {
                        request.setAttribute("messageError", "Operazione non riuscita!cancellazione Recensione e' fallita");
                        rd = sc.getRequestDispatcher("/error.jsp");
                        rd.forward(request, response);
                    }
                    if (gestoreRecensioniBean.eliminaRecensioneInterna(recensione)) {
                        rd = sc.getRequestDispatcher("/Controller?button=visualizzaRecensioniInterne");
                        rd.forward(request, response);
                    } else {
                        request.setAttribute("messageError", "Operazione non riuscita!cancellazione Recensione e' fallita");
                        rd = sc.getRequestDispatcher("/error.jsp");
                        rd.forward(request, response);
                    }
                } else {
                    request.setAttribute("messageError", "Operazione non riuscita!non sei un amministratore o non sei il recensore creatore della notizia");
                    rd = sc.getRequestDispatcher("/error.jsp");
                    rd.forward(request, response);
                }
            } else {
                request.setAttribute("messageError", "Operazione non riuscita!recensione non e' trovata");
                rd = sc.getRequestDispatcher("/error.jsp");
                rd.forward(request, response);
            }
        } else {
            request.setAttribute("messageError", "Operazione non riuscita!Non si dispone dei privilegi necessari per accedere alla pagina richiesta");
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }
    }

    /**
     * Metodo ausiliario per la modifica di una recensione esterna caricando
     * tutti i dati dal ArticoloNuovo che si sta per modificarlo
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azionePreparaModificaRecEsterna(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        sc = getServletContext();
        rd = null;
        session = request.getSession(true);
        session.setMaxInactiveInterval(60 * 60 * 24);
        Utente utenteAttuale = (Utente) session.getAttribute("utente");
        if (utenteAttuale != null) {
            long idRecensione = Long.parseLong(request.getParameter("id"));
            RecensioneEsterna recensione = gestoreRecensioniBean.trovaEsterna(idRecensione);

            if (recensione != null) {
                //if(utenteAttuale.getTipo().equals("r")&&(notizia.getAutore().getId().equals(utenteAttuale.getId()))||(utenteAttuale.getTipo().equals("a"))){
                if (utenteAttuale.getTipo().equals("a") || ((recensione.getAutore().getId().equals(utenteAttuale.getId())) || utenteAttuale.getTipo().equals("r"))) {
                    request.setAttribute("recensione", recensione);
                    rd = sc.getRequestDispatcher("/modifyRecEsterna.jsp");
                    rd.forward(request, response);
                    // nella modifica non dai possibilita di modificare il titolo e la data
                } else {
                    request.setAttribute("messageError", "Operazione non riuscita!non sei un recensore o non sei il creatore della notizia");
                    rd = sc.getRequestDispatcher("/error.jsp");
                    rd.forward(request, response);
                }
            } else {
                request.setAttribute("messageError", "Operazione non riuscita!notizia non e' trovata");
                rd = sc.getRequestDispatcher("/error.jsp");
                rd.forward(request, response);
            }
        } else {
            request.setAttribute("messageError", "Operazione non riuscita!Non si dispone dei privilegi necessari per accedere alla pagina richiesta");
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }
    }

    /**
     * Metodo ausiliario che porta alla pagina di modifica di una
     * RecensioneEsterna
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneModificaRecensioneEsternaAus(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        sc = getServletContext();
        rd = null;
        session = request.getSession(true);
        session.setMaxInactiveInterval(60 * 60 * 24);
        List<RecensioneEsterna> l = gestoreRecensioniBean.visualizzaRecensioniEsterne();

        request.setAttribute("recensioniEsterne", l);
        rd = sc.getRequestDispatcher("/listRecensioniEsterne.jsp");
        rd.forward(request, response);
    }

    /**
     * Cancella una recensione esterna dal DB da parte dal recensore creatore
     * della recensione o da parte di un amministratore caricando tutti i dati
     * dal ArticoloNuovo che si sta per modificarlo
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneCancellaRecensioneEsterna(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        sc = getServletContext();
        rd = null;
        session = request.getSession(true);
        session.setMaxInactiveInterval(60 * 60 * 24);
        Utente utenteAttuale = (Utente) session.getAttribute("utente");
        if (utenteAttuale != null) {
            long idRecensione = Long.parseLong(request.getParameter("id"));
            RecensioneEsterna recensione = gestoreRecensioniBean.trovaEsterna(idRecensione);
            if (recensione != null) {
                if (utenteAttuale.getTipo().equals("r") && (recensione.getAutore().getId().equals(utenteAttuale.getId())) || (utenteAttuale.getTipo().equals("a"))) {
                    if (gestoreRecensioniBean.eliminaRecensioneEsterna(recensione)) {
                        rd = sc.getRequestDispatcher("/Controller?button=visualizzaRecensioniEsterne");
                        rd.forward(request, response);
                    } else {
                        request.setAttribute("messageError", "Operazione non riuscita!cancellazione Recensione e' fallita");
                        rd = sc.getRequestDispatcher("/error.jsp");
                        rd.forward(request, response);
                    }
                } else {
                    request.setAttribute("messageError", "Operazione non riuscita!non sei un amministratore o non sei il recensore creatore della notizia");
                    rd = sc.getRequestDispatcher("/error.jsp");
                    rd.forward(request, response);
                }
            } else {
                request.setAttribute("messageError", "Operazione non riuscita!recensione non e' trovata");
                rd = sc.getRequestDispatcher("/error.jsp");
                rd.forward(request, response);
            }
        } else {
            request.setAttribute("messageError", "Operazione non riuscita!Non si dispone dei privilegi necessari per accedere alla pagina richiesta");
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }
    }

    /**
     * Modifica di una recensione esterna da parte dal recensore creatore della
     * recensione o da parte di un amministratore caricando tutti i dati dal
     * ArticoloNuovo che si sta per modificarlo
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneModificaRecensioneEsterna(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        sc = getServletContext();
        rd = null;
        session = request.getSession(true);
        session.setMaxInactiveInterval(60 * 60 * 24);
        Utente utenteAttuale = (Utente) session.getAttribute("utente");
        if (utenteAttuale != null) {
            if (utenteAttuale.getTipo().equals("r") || utenteAttuale.getTipo().equals("a")) {
                //estraggo il titolo
                String url = request.getParameter("url");
                RecensioneEsterna re = gestoreRecensioniBean.getRecensioneEsterna(url);

                //estraggo la data
                int scala = Integer.parseInt(request.getParameter("scala"));;

                double valutazione = Double.parseDouble(request.getParameter("voto"));

                RecensioneEsterna newRecensione = gestoreRecensioniBean.modificaRecensioneEsterna(scala, valutazione, url);

                if (newRecensione != null) {
                    rd = sc.getRequestDispatcher("/Controller?button=modificaRecensioneEsternaAus");
                    rd.forward(request, response);
                } else {
                    request.setAttribute("messageError", "Operazione non riuscita!inserimento recensione fallito");
                    azioneHome(request,response);
                }
            }

        } else {
            request.setAttribute("messageError", "Operazione non riuscita!non sei un recensore");
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }
    }

    /**
     * Visualizza le RecensioniInterne
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneVisualizzaRecensioniInterne(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        sc = getServletContext();
        rd = null;
        List<RecensioneInterna> recensioniInterne = gestoreRecensioniBean.visualizzaRecensioniInterne();
        request.setAttribute("recensioniInterne", recensioniInterne);
        rd = sc.getRequestDispatcher("/listRecensioniInterne.jsp");
        rd.forward(request, response);
    }

    /**
     * Visualizza le RecensioniEsterne
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneVisualizzaRecensioniEsterne(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        sc = getServletContext();
        rd = null;
        List<RecensioneEsterna> recensioniEsterne = gestoreRecensioniBean.visualizzaRecensioniEsterne();
        request.setAttribute("recensioniEsterne", recensioniEsterne);
        rd = sc.getRequestDispatcher("/listRecensioniEsterne.jsp");
        rd.forward(request, response);
    }

    /**
     * Visualizza la Recensione selezionata
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneVisualizzaRecensione(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        sc = getServletContext();
        rd = null;
        RecensioneInterna recensione = gestoreRecensioniBean.trova(Long.parseLong(request.getParameter("selezionato")));
        request.setAttribute("RecensioneSelezionata", recensione);
        request.setAttribute("testo", readFile(recensione.getTesto()));
        List<RecensioneEsterna> recensioni = gestoreRecensioniBean.getRecensioniEsterne(recensione.getVideogiochi());
        request.setAttribute("RecensioniEsterne", recensioni);
        rd = sc.getRequestDispatcher("/viewRecensione.jsp");
        rd.forward(request, response);
    }

    /**
     * Visualizza la notizia selezionata
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneVisualizzaNotizia(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        sc = getServletContext();
        rd = null;
        Notizia notizia = gestoreNotiziaBean.trova(Long.parseLong(request.getParameter("selezionato")));
        request.setAttribute("NotiziaSelezionata", notizia);
        request.setAttribute("platform", request.getParameter("platform"));
        request.setAttribute("testo", readFile(notizia.getTesto()));
        rd = sc.getRequestDispatcher("/viewNews.jsp");
        rd.forward(request, response);
    }

    /**
     * Metodo ausiliario che porta alla pagina dell'aggiunta voto
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneAggiungiVotoAus(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        sc = getServletContext();
        rd = null;
        rd = sc.getRequestDispatcher("/addVotesReview.jsp");
        rd.forward(request, response);
    }

    /**
     * Aggiunge un voto al DB
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneAggiungiVoto(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, ParseException {
        sc = getServletContext();
        rd = null;
        session = request.getSession(true);
        session.setMaxInactiveInterval(60 * 60 * 24);
        Utente utenteAttuale = (Utente) session.getAttribute("utente");

        if (utenteAttuale != null) {
            if (utenteAttuale.getTipo().equals("r")) {
                List<Videogame> videogiochi = (List<Videogame>) session.getAttribute("videogamesForVoti");
                Voto voto = new Voto();
                voto.setScala(10);
                Double val = 0.0;
                for (Videogame v : videogiochi) {
                    try {
                        val = new Double(request.getParameter(v.getId().toString()) + ".0");
                        voto.setValutazione(val);
                        gestoreVideogameBean.modificaVideogame(v.getId(), v.getNome(), v.getGenere(), v.getNumeroGiocatori(), v.isMultiplayer(), v.getDataUscita(), v.getPiattaforma(), v.getSviluppatore(), v.getDistributore(), voto, v.getImmagineCopertina(), v.getPEGI());
                        request.setAttribute("messageError", "azione compiuta con successo");
                        rd = sc.getRequestDispatcher("/Controller?button=modificaRecensioneInternaAus");
                        rd.forward(request, response);
                    } catch (Exception e) {
                        request.setAttribute("messageError", "modifica non avvenuta correttamente " + e.getMessage());
                        rd = sc.getRequestDispatcher("/error.jsp");
                        rd.forward(request, response);
                    }
                }
            } else {
                request.setAttribute("messageError", "Operazione non riuscita!non sei un amministratore");
                rd = sc.getRequestDispatcher("/error.jsp");
                rd.forward(request, response);
            }
        } else {
            request.setAttribute("messageError", "Operazione non riuscita!Non si dispone dei privilegi necessari per accedere alla pagina richiesta");
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }
    }

    /**
     * Riabilita un utente da parte di un amministratore
     *
     * @param request servlet request
     * @param response servlet response
     * @throws IOException se si verifica un errore di I/O
     * @throws ServletException se si verifica un errore specifico della servlet
     */
    private void azioneAbilitaUtente(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        sc = getServletContext();
        rd = null;
        session = request.getSession(true);
        session.setMaxInactiveInterval(60 * 60 * 24);
        Utente utenteAttuale = (Utente) session.getAttribute("utente");
        if (utenteAttuale != null) {
            if (utenteAttuale.getTipo().equals("a")) {
                long idUtente = Long.parseLong(request.getParameter("idUtente"));
                Utente utente = gestoreUtenteBean.trova(idUtente);
                if (utente != null) {
                    if (!utente.getTipo().equals("a")) {
                        if (gestoreUtenteBean.abilita(utente)) {

                            rd = sc.getRequestDispatcher("/Controller?button=visualizzaUtenti");
                            rd.forward(request, response);
                        } else {
                            request.setAttribute("messageError", "Operazione non riuscita!cancellazione utente e' fallita");
                            rd = sc.getRequestDispatcher("/error.jsp");
                            rd.forward(request, response);
                        }
                    } else {
                        request.setAttribute("messageError", "Operazione non riuscita!Non si puo' cancellare un administrator");
                        rd = sc.getRequestDispatcher("/error.jsp");
                        rd.forward(request, response);
                    }
                } else {
                    request.setAttribute("messageError", "Operazione non riuscita!utente non trovato");
                    rd = sc.getRequestDispatcher("/error.jsp");
                    rd.forward(request, response);
                }
            } else {
                request.setAttribute("messageError", "Operazione non riuscita!non sei un administrator");
                rd = sc.getRequestDispatcher("/error.jsp");
                rd.forward(request, response);
            }
        } else {
            request.setAttribute("messageError", "Operazione non riuscita!Non si dispone dei privilegi necessari per accedere alla pagina richiesta");
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }
    }

    private void azioneHome(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        
                    List<Notizia> l;
                    l = notiziaFacade.findAll();
                    request.setAttribute("listNotizie", l);
                    List<String> testoNotizie = new ArrayList<String>();
                    if (l != null) {
                        for (Notizia n : l) {
                            testoNotizie.add(readFile(n.getTesto()));
                        }
                    }
                    request.setAttribute("testoNotizie", testoNotizie);


                    List<RecensioneInterna> r;

                    r = gestoreRecensioniBean.visualizzaRecensioniInterne();

                    request.setAttribute("listRecensioni", r);
                    List<String> testoRecensioni = new ArrayList<String>();
                    if (r != null) {
                        for (RecensioneInterna ri : r) {
                            testoRecensioni.add(readFile(ri.getTesto()));
                        }
                    }
                    request.setAttribute("testoRecensioni", testoRecensioni);
                    rd = sc.getRequestDispatcher("/home.jsp");
                    //rd = sc.getRequestDispatcher("/MenuProject5.html");
                    rd.forward(request, response);
    }
}
